我有一个泰语字符很少的字符串。该字符串使用unicode字符。但是,即使在文本文件中写入字符串,我也看不到IDE中的泰语字符。如果我想正确查看泰语字符,则必须编写以下代码
var text = "M_M-150 150CC. เดี่ยว (2 For 18 Save 2)";
var ascii = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
应用上述逻辑后,我可以正确看到带有泰文字符的字符串。这是输出
// notice the thai character เดี่ยว in the string
M_M-150 150CC. เดี่ยว (2 For 18 Save 2)
我不确定为什么我需要应用以上逻辑才能看到泰语字符,即使字符串是Unicode? 在这种情况下,Encoding.Default到底在做什么?
答案 0 :(得分:4)
从MSDN
不同的计算机可以使用不同的编码作为默认编码,并且 默认编码甚至可以在一台计算机上更改。因此, 数据从一台计算机流到另一台计算机,甚至在 同一台计算机上的不同时间可能无法正确翻译。 此外,Default属性返回的编码使用 最适合的后备选项,将不支持的字符映射到字符 代码页支持。由于这两个原因,使用默认 通常不建议使用编码。确保编码字节 正确解码,则应使用Unicode编码,例如 UTF8Encoding或UnicodeEncoding,带有前导。另一种选择是 使用更高级别的协议来确保将相同的格式用于 编码和解码。
该字符串由Encoding.Default传入,但随后使用UTF8解码 因此,瓶颈不是Encoding.Default。它是Encoding.UTF8 它占用字节并将其正确转换为字符串。
即使您尝试在控制台中将其打印。 看一下两种情况: 第二行,用utf8配置打印 您可以通过添加以下行来配置控制台以支持utf8:
Console.OutputEncoding = Encoding.UTF8;
同时使用Encoding.UTF8将字符串转换为字节
var text = "M_M-150 150CC. เดี่ยว (2 For 18 Save 2";
var ascii = Encoding.UTF8.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
结果将是:
如果您查看Supported Scripts,您会看到 UTF8 支持所有Unicode字符
包括泰语。
请注意,例如,Encoding.Default将无法读取中文或日文,
以这个例子为例:
var text = "漢字";
var ascii = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
这是文本文件的输出:
在这里,如果您尝试将其写入文本,则不会成功转换。
所以您必须使用UTF8进行读写
var text = "漢字";
var ascii = Encoding.UTF8.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);
您会得到的:
正如我所说,整个过程取决于 UTF8 而不是默认编码。