Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
1

Переобразовать кодировку ucs2be в utf8

22.07.2015, 14:51. Показов 1445. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как в memo загрузить текстовый файл с кодировкой ucs2be? Файл пример вложил.
Вложения
Тип файла: txt new 1.txt (8 байт, 10 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2015, 14:51
Ответы с готовыми решениями:

Сменить кодировку с UTF8 на mac-cyrillic
Приветствую, есть файл сторонней программы(компас-3D) редактирую его средствами VBNET и получаю...

Определить кодировку файла (UTF8 без BOM)
Мужики, всем привет! Может кто занимался подобным, подскажите, как можно определить кодировку...

Изменить кодировку страницы, получаемой с сервера, на UTF8
Нужно запросить у сервера содержание страницы, которая в формате atom...

На сайте одна строчка не принимает кодировку utf8
Все файлы в utf8, и эта строчка также в файле где кодировка utf8 но почему-то вместо нормальных...

14
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
22.07.2015, 15:12 2
Открывать файл как обычно, но его содержимое конвертировать в UTF8 при помощи UCS2BEToUTF8 из модуля LConvEncoding
1
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
22.07.2015, 15:42  [ТС] 3
Нет, не прокатывает так. Я этот файл пробовал в pchar загружать и передавать на конвертирование через UnicodeString. Примерно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  
var
  rCnt: integer;
  p: PChar;
  lFile: TFileStream;
begin
  Result:= '';
  lFile:= TFileStream.Create(fName, fmOpenRead);
  try
    rCnt:= lFile.Size;
    GetMem(p, rCnt);
    lFile.Position:= 0;
    lFile.Read(p^, rCnt);
    Memo1.Lines.Text:= UCS2BEToUTF8(UnicodeString(p));
    Freemem(p);
  finally
    lFile.Free;
  end;
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
22.07.2015, 15:51 4
Если бы не проходило - я бы не отвечал:
Pascal
1
2
3
4
5
6
7
8
  with TStringList.Create do
  try
    LoadFromFile(fn);
    Memo2.Lines.Text := Text; // тут кракозябры
    Memo1.Lines.Text := LConvEncoding.UCS2BEToUTF8(Text); // тут нормальный текст
  finally
    Free;
  end;
1
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
22.07.2015, 22:04  [ТС] 5
Да, так работает. Но в конце текста какая-то кряка есть. Вместо vbn открывает как vbnഊ. Как это теперь исправить?

Добавлено через 1 час 18 минут
Нужно длину текста на 1 меньше выводить что-ли?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
22.07.2015, 23:50 6
Лучший ответ Сообщение было отмечено ardans как решение

Решение

Цитата Сообщение от ardans Посмотреть сообщение
Нужно длину текста на 1 меньше выводить что-ли?
Не совсем. Попробуй открыть многострочный файл - увидишь о чем я. Там бардак получается с символами перевода строки, нужно убрать символы U+0A00 (последовательность кодов #$e0#$a8#$80) и U+0D0A (последовательность #$e0#$b4#$8a) из строки, тогда все прекрасно выводится, безо всяких "хвостов":
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var t : string;
begin
  with TStringList.Create do
  try
    LoadFromFile(fn);
    t := StringReplace(
      StringReplace(ConvertEncoding(Text, GuessEncoding(Text), EncodingUTF8),
                    #$e0#$a8#$80, '', [rfReplaceAll]), #$e0#$b4#$8a, '', [rfReplaceAll]);
    Memo2.Lines.Text := t;
  finally
    Free;
  end;
end;
1
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
23.07.2015, 08:14  [ТС] 7
volvo, спасибо! Ты решил мою проблему.

Добавлено через 51 минуту
Еще заметил, что если загрузить многострочный текст, то после каждой строки лишняя пустая строка имеется. Что-то не убирается?

Добавлено через 22 минуты
Кстати только если конец строки виндовый. С линуксовым все нормально.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
23.07.2015, 09:10 8
Цитата Сообщение от ardans Посмотреть сообщение
после каждой строки лишняя пустая строка имеется
У меня нет никаких лишних строк:
Миниатюры
Переобразовать кодировку ucs2be в utf8  
0
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
23.07.2015, 10:10  [ТС] 9
Да, если в винде запустить приложение. А если скомпилить в линуксе, то появляются.
Миниатюры
Переобразовать кодировку ucs2be в utf8   Переобразовать кодировку ucs2be в utf8   Переобразовать кодировку ucs2be в utf8  

0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
23.07.2015, 10:18 10
А у меня тоже нет пустых строк, но в начале первой строки квадрат, что ни пишу в файл
Изображения
 
0
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
23.07.2015, 10:21  [ТС] 11
Да, в винде нет пустых строк. Они появляются если программу в линуксе запустить. Я по дефолту линукс использую, поэтому заметил.
У меня в начале появляется кряка если вместо memo использовать synedit.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
23.07.2015, 10:33 12
Цитата Сообщение от ardans Посмотреть сообщение
А если скомпилить в линуксе, то появляются.
Ну, значит, в отладчике надо посмотреть, что из себя представляет строка t перед присвоением ее свойству Lines.Text, наверняка там есть лишний #13, его тоже надо бы удалить, тем же макаром (я сейчас под Windows, так что проверить линуксом не могу)
0
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
23.07.2015, 11:41  [ТС] 13
volvo, если в отладчике смотреть t в линуксе между строчками #10#10, а в винде - #13
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
23.07.2015, 12:56 14
Значит, добавь
Pascal
1
2
3
    {$IFDEF UNIX}
    t := StringReplace(t, #10#10, #10, [rfReplaceAll]);
    {$ENDIF}
, если важно, чтобы не добавлялись лишние строки. В общем, как-то пока корявенько конвертация кодировок происходит, если нужно столько доп. движений делать...
1
6 / 5 / 1
Регистрация: 30.07.2014
Сообщений: 56
23.07.2015, 14:18  [ТС] 15
да, спасибо volvo. я так и сделал пока.
0
23.07.2015, 14:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 14:18
Помогаю со студенческими работами здесь

Как поменять кодировку текстового файла с ANSI на utf8 через VBA
Добрый день. есть текстовый файл с кодировкой ANSI. Можно через VBA поменять кодировку на utf8.

Создал первое WCF Console Application по примеру. Ругается на кодировку utf8
Всем привет. Недавно начал изучать WCF. Делал все строго по Видео за исключением, что БД на мускуле...

снова про кодировку, utf8 джÑ�к
есть несколько полей вида: <input type="text" name="login" maxlength="40" value="<?php echo...

Преобразовать UCS2BE в UCF8
Доброго времени суток. Необходимо преобразовать UCS2BE в UCF8. dataPtr - массив char* (UCS2BE)...

JSON переобразовать в JS
Я в view передал модель. Модель имеет в себе еще один объект, который, и содержит нужный масив....

переобразовать текст в 0 и 1
прошу прощение если повторяю тему,просто не знаю как правильно вопрос для поиска задать,решил тему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru