代码的意图是将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
任何想法都错了?
答案 0 :(得分:2)
错误的是字符串(key
)没有用于存储它的字节的概念。在这种情况下,您的字符串是:
字符串:
アップロードするファイルが指定されていません
这正是
"\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);
内容将是(以字节为单位)
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
答案 1 :(得分:0)
One不会将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
。
快乐的编码。