2009-09-23 3 views
1

Я загружаю текст из текстового файла в richedit, но вместо этого отображает странные китайские символы, что я делаю неправильно?Китайские символы при загрузке текста

ms := TMemoryStream.Create; 
ms.LoadFromFile('C:\aw.txt'); 
ms.Seek(0, soFromEnd); 
zChar:=#0; 
ms.Write(zChar, 1); 
ms.Seek(0, soFromBeginning); 
RichEdit1.SetSelTextBuf(ms.Memory); 
ms.free; 
+1

Какую версию Delphi? Что такое кодировка текстового файла? –

+0

Это новый созданный txt-файл через Windows. Delphi 7 – Tom

+0

Если вы используете Блокнот, убедитесь, что он сохранил его как кодировку ASCII, а не UTF8 –

ответ

3

Редактировать Пересмотр моего ответа из-за замечания по вопросу, особенно намек на Delphi 7.

Richedit основан на richedit.dll, который исходит от MS и упакован с Windows. После Windows ME он включен UNICODE. Таким образом, он получает набор символов, интерпретирующий первые 2 символа файла как BOF. Существуют экземпляры, в которых символы будут интерпретироваться и считаться BOF в файлах ASCII или ANSI (они не будут иметь BOF по соображениям совместимости). Это можно увидеть и в файле write.exe.

Убедитесь, что вы используете правильную кодировку при сохранении файла в блокноте. Если файл не имеет кодировки (посмотрите на первые два байта в двоичном средстве просмотра), попробуйте - если возможно - добавить два пробела в фронт и посмотреть, сохраняется ли проблема.

Delphi 2009 и 2010

Я оставлю мой первый ответ, чтобы помочь людям при обновлении до Delphi 2009 и выше:

Я бы на самом деле сказать, что текстовый файл не имеет кодировку, но является чистым ASCII или ANSI, и вы используете Delphi 2009 или 2010, который включен UNICODE. Первые два символа будут восприниматься как BOF (который сообщает программе, в которой используется кодировка UNICODE). Если это будет правильный BOF, возможно, будет применена неправильная кодировка.

TMemoryStream не позволяет применять кодирование.

Если возможно, вы можете использовать TStrings, который имеет новый параметр TEncoding в методе LoadFromFile. Это было бы как

RichEdit1.Lines.LoadFromFile('c:\test.txt', TEncoding.ASCII); 

Посмотрите на этой странице, а также: http://edn.embarcadero.com/article/38693

+0

Это больше, чем просто первые два символа, если там нет метки. Таким образом, популярный кляп спасения «Буш спрятал файлы» в блокноте, и когда вы его прочитали, вы получаете тарабарщину на китайском языке. (Слова на самом деле не имеют значения, это длина слов.) –

+0

См. Также «The Old New Thing»: «Проблема кодирования файла Notepad, сокращение» - http://blogs.msdn.com/oldnewthing/archive /2007/04/17/2158334.aspx В основном это проблема, которую вы не можете исправить. –

Смежные вопросы