2008-09-27 8 views

ответ

7

C# (и .Net в целом) обрабатывает строки unicode прозрачно, и вам не нужно делать ничего особенного, если вашему приложению не нужно читать/записывать файлы с определенными кодировками. В таких случаях вы можете преобразовать управляемые строки в байтовые массивы кодировки по вашему выбору, используя классы в пространстве имен System.Text.Encodings.

1

Только подумайте о кодировании при чтении и записи потоков. Используйте TextReader и TextWriters для чтения и записи текста в разных кодировках. Всегда используйте utf-8, если у вас есть выбор.

Не путайте языки и культуры - это совершенно отдельная проблема из юникода.

0

.Net имеет относительно хорошую поддержку i18n. Вам действительно не нужно думать о unicode так сильно, как все строки .Net и встроенные строковые функции делают правильные вещи с помощью unicode. Единственное, что нужно иметь в виду, это то, что большинство строковых функций, например DateTime.ToString(), по умолчанию используют культуру потока, которая по умолчанию является культурой Windows. Вы можете указать другую культуру для форматирования либо по текущему потоку, либо по каждому вызову метода.

Единственный раз, когда unicode является проблемой при кодировании/декодировании строк в и из байтов.

11

Имейте в виду, что строки C# являются сегментами кодовых блоков Char, UTF-16. Это не Код Юникода. Для некоторых кодов Unicode требуется два Char, и вы не должны разделить строки между этими Chars.

Кроме того, юникодные коды могут объединяться для формирования символа одного языка - например, «u» Char, за которым следует umlat Char. Таким образом, вы не можете разделить строки между произвольными кодовыми точками.

В принципе, это путаница проблем, когда любая проблема может только на практике повлиять на языки, которых вы не знаете.

0

Как уже упоминалось, строки .NET обрабатывают Unicode прозрачно. Помимо ввода/вывода файлов, другое соображение будет на уровне базы данных. Например, SQL Server различает VARCHAR (не Unicode) и NVARCHAR (который обрабатывает unicode). Также необходимо обратить внимание на параметры хранимой процедуры.

2

System.String уже обработал unicode внутри, так что вы там покрыты. Лучшей практикой было бы использовать System.Text.Encoding.UTF8Encoding при чтении и записи файлов. Однако это больше, чем просто чтение/запись файлов, все, что передает данные, включая сетевые подключения, зависит от кодировки. Если вы используете WCF, для большинства привязок он будет по умолчанию UTF8 (на самом деле большинство вообще не разрешают ASCII).

UTF8 - хороший выбор, потому что, хотя он по-прежнему поддерживает весь набор символов Юникода, для большей части набора символов ASCII он имеет байтовое сходство. Таким образом, наивные приложения, которые не поддерживают Unicode, имеют некоторую возможность чтения/записи данных ваших приложений. Эти приложения будут только терпеть неудачу, когда вы начнете использовать расширенные символы.

System.Text.Encoding.Unicode будет писать UTF-16, который имеет минимум два байта на символ, что делает его более крупным и полностью несовместимым с ASCII. И System.Text.Encoding.UTF32, как вы можете догадаться, еще больше. Я не уверен в использовании в реальном времени UTF-16 и 32, но, возможно, они работают лучше, когда у вас есть большое количество расширенных символов.Это всего лишь теория, но если это так, то японские и китайские разработчики, создающие продукт, который будет использоваться в основном на этих языках, могут найти UTF-16/32 лучший выбор.

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