unicode字符串中的泰语字符问题

时间:2018-06-20 15:08:21

标签: c# .net globalization unicode-string thai

我有一个泰语字符很少的字符串。该字符串使用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到底在做什么?

1 个答案:

答案 0 :(得分:4)

从MSDN

Encoding.Default Property是什么:

  

不同的计算机可以使用不同的编码作为默认编码,并且   默认编码甚至可以在一台计算机上更改。因此,   数据从一台计算机流到另一台计算机,甚至在   同一台计算机上的不同时间可能无法正确翻译。   此外,Default属性返回的编码使用   最适合的后备选项,将不支持的字符映射到字符   代码页支持。由于这两个原因,使用默认   通常不建议使用编码。确保编码字节   正确解码,则应使用Unicode编码,例如   UTF8Encoding或UnicodeEncoding,带有前导。另一种选择是   使用更高级别的协议来确保将相同的格式用于   编码和解码。

该字符串由Encoding.Default传入,但随后使用UTF8解码 因此,瓶颈不是Encoding.Default。它是Encoding.UTF8 它占用字节并将其正确转换为字符串。

即使您尝试在控制台中将其打印。 看一下两种情况: enter image description here 第二行,用utf8配置打印 您可以通过添加以下行来配置控制台以支持utf8:

Console.OutputEncoding = Encoding.UTF8;

即使使用您的代码: 文件中的结果将如下所示: enter image description here

同时使用Encoding.UTF8将字符串转换为字节

var text = "M_M-150 150CC. เดี่ยว (2 For 18 Save 2";
var ascii = Encoding.UTF8.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);

结果将是:

enter image description here

如果您查看Supported Scripts,您会看到 UTF8 支持所有Unicode字符

  

包括泰语。

请注意,例如,Encoding.Default将无法读取中文或日文,

以这个例子为例:

var text = "漢字";
var ascii = Encoding.Default.GetBytes(text);
text = Encoding.UTF8.GetString(ascii);

这是文本文件的输出:

enter image description here

在这里,如果您尝试将其写入文本,则不会成功转换。

所以您必须使用UTF8进行读写

 var text = "漢字";
 var ascii = Encoding.UTF8.GetBytes(text);
 text = Encoding.UTF8.GetString(ascii);

您会得到的:

enter image description here

正如我所说,整个过程取决于 UTF8 而不是默认编码。