UTF32 и C # проблемы - PullRequest
       61

UTF32 и C # проблемы

8 голосов
/ 03 апреля 2012

Так что у меня проблемы с кодировкой символов.Когда я помещаю следующие два символа в текстовый файл в кодировке UTF32:

?
鸕

, а затем запускаю на них этот код:

System.IO.StreamReader streamReader = 
    new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false);
System.IO.StreamWriter streamWriter = 
    new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32);

streamWriter.Write(streamReader.ReadToEnd());

streamWriter.Close();
streamReader.Close();

Я получаю:

鸕
鸕

(один и тот же символ дважды, то есть входной файл! = Вывод)

Несколько вещей, которые могут помочь: Шестнадцатеричное значение для первого символа:

15 9E 02 00

И для второго:

15 9E 00 00

Я использую Gedit для создания текстового файла, моно для C #, и я использую Ubuntu.

Это такжене имеет значения, если я указываю кодировку для входного или выходного файла, просто не нравится, если он находится в кодировке UTF32.Работает, если входной файл в кодировке UTF-8.

Входной файл выглядит следующим образом:

FF FE 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 0000 00

Это ошибка, или это только у меня?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 09 апреля 2012

K, так что я понял это, я думаю, сейчас это работает.Оказывается, поскольку коды для символов были 15 9E 02 00 и 15 9E 00 00, то их нельзя удерживать в одном, единственном UTF-16 char.Таким образом, вместо UTF16 используются эти суррогатные пары, где есть два разных символа, которые действуют как один «элемент».Чтобы получить элементы, мы можем использовать:

StringInfo.GetTextElementEnumerator(string fred);

, и это возвращает строку с суррогатными парами.Рассматривайте это как один символ.

См. Здесь:

http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

http://msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.gettextelement.aspx

Надеюсь, это кому-нибудь поможет: D

1 голос
/ 03 апреля 2012

Я попробовал это, и это хорошо работает на моем ПК.

System.IO.StreamReader streamReader = new System.IO.StreamReader("input", true);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("output", false);

streamWriter.Write(streamReader.ReadToEnd());

streamWriter.Close();
streamReader.Close();

Возможно, вы думаете, что текст в UTF32 - , а не .

0 голосов
/ 03 апреля 2012

Из раздела «Примечания» MSDN для Конструктор StreamReader :

Этот конструктор инициализирует кодировку, как указано в кодировке параметр, а также размер внутреннего буфера до 1024 байт. Объект StreamReader пытается обнаружить кодировку, просматривая первые три байта потока. Он автоматически распознает UTF-8, Unicode с прямым порядком байтов и Unicode с прямым порядком байтов, если файл запускается с соответствующими метками порядка байтов. В противном случае, предоставленный пользователем кодировка используется. Смотрите метод Encoding.GetPreamble для получения дополнительной информации. информация.

Скорее всего, метки порядка байтов в начале вашего файла фактически указывают UTF 16 (или что-то в этом роде), и поэтому он не использует вашу явно указанную кодировку UTF 32.

0 голосов
/ 03 апреля 2012

Я думаю, вам нужно указать ту же кодировку (Encoding.UTF32) и для вашего StreamWriter.

РЕДАКТИРОВАТЬ:

Обычно это не требуется между кодовыми страницами UTF, но я бы такжепопробуйте это:

Encoding utf8 = Encoding.UTF8;
Encoding utf32 = Enconding.UTF32;
byte[] utf8Bytes = utf8.GetBytes(yourText);
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes);
string utf32Text = iso.GetString(utf32Text);
0 голосов
/ 03 апреля 2012

При записи вы не указываете UTF-32, поэтому по умолчанию используется Encoding.UTF8.

От MSDN :

Этот конструктор создает StreamWriterс кодировкой UTF-8 без метки порядка байтов (BOM), поэтому его метод GetPreamble возвращает пустой байтовый массив.Чтобы создать StreamWriter с использованием кодировки UTF-8 и спецификации, рассмотрите возможность использования конструктора, который задает кодировку, например StreamWriter (String, Boolean, Encoding).

...