C #: японские символы с кодировкой Юникод - PullRequest
1 голос
/ 30 августа 2011

Код предназначен для печати в файл в кодировке Unicode в виде японских символов

   String s = "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093";
   var Bytes = Encoding.Unicode.GetBytes(s);      
   string  key = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Unicode, Encoding.UTF8, Bytes));

Ключ - я хочу напечатать в файл, но имеет значение \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093 Есть идеи, что не так?

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Что не так, так это то, что строка (key) не имеет представления о байтах, использованных для ее хранения.В этом случае ваша строка:

String :

アップロードするファイルが指定されていません

Это именно то, что означает

"\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093" 

.Выражение '\u30a3' выглядит как 2 байта Unicode, но на самом деле оно просто означает символ 'ア'.

при сохранении в файл UTF-8 записанные байты будут иметь вид:

байтов UTF-8

File.WriteAllText("temp.txt", "アップロードするファイルが指定されていません", Encoding.UTF8);

Содержимое будетbe (в байтах)

 E3 82 A2 E3 83 83 E3 83 97 E3 83 AD E3 83 BC E3 83 89 E3 81 99 E3 82 8B E3 83 
 95 E3 82 A1 E3 82 A4 E3 83 AB E3 81 8C E6 8C 87 E5 AE 9A E3 81 95 E3 82 8C E3 
 81 A6 E3 81 84 E3 81 BE E3 81 9B E3 82 93

UTF-16 байтов

File.WriteAllText("temp.txt", "アップロードするファイルが指定されていません", Encoding.Unicode);

Содержимое будет (в байтах)

 A2 30 C3 30 D7 30 ED 30 FC 30 C9 30 59 30 8B 30 D5 30 A1 30 A4 30 EB 30 4C 30 
 07 63 9A 5B 55 30 8C 30 66 30 44 30 7E 30 5B 30 93 30
0 голосов
/ 30 августа 2011

Нельзя «конвертировать» Unicode в UTF-8: - /

Unicode , кроме того, что он является родителем для всего набора спецификаций, можно считать «простоопределение кодовых точек / символов и правил взаимодействия.Кодировка UTF-8 - это особый набор правил для преобразования последовательности кодовых точек Unicode в последовательность октетов (8-битных байтов).

Попробуйте это в LINQPad :

String s = "\u30a2\u30c3\u30d7\u30ed";
s.Dump();     // original string
var bytes = Encoding.UTF8.GetBytes(s);      
bytes.Dump(); // see UTF-8 encoded byte sequence
string key = Encoding.UTF8.GetString(bytes);
key.Dump();   // contents restored

UTF-8 существует только в bytes.

Счастливое кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...