我对此知之甚少,并希望寻求帮助。我使用的语言是C#。
我有2个单词被编码为UTF-8 CSV文件:
TĂ´̀‰ng
Tổng
我创建了一个带有2个文本框的测试Windows窗体,并添加了以下事件:
private void textBox3_TextChanged(object sender, EventArgs e)
{
byte[] decodeutf = Encoding.Default.GetBytes(textBox3.Text);
textBox4.Text = Encoding.UTF8.GetString(decodeutf);
}
向textBox3
输入1或2。我在textBox4
中得到的结果与Tổng
相同。
当我尝试将相同的过程恢复为输入Tổng
以获得2的结果时,我总是得到1。
恢复代码如下(另外2个文本框):
private void textBox1_TextChanged(object sender, EventArgs e)
{
Encoding utf8 = new UTF8Encoding();
byte[] encodedBytes = utf8.GetBytes(textBox1.Text);
textBox2.Text = Encoding.Default.GetString(encodedBytes);
}
结果只有TĂ´̀‰ng
。
如上所述,编码为UTF-8和读回Unicode有什么不同?
答案 0 :(得分:1)
您的Encoding.Default
是Windows-1258(越南语)。
'TĂ´̀‰ng'
,然后用UTF-8解码生成以下五个Unicode代码点:
LATIN CAPITAL LETTER T
LATIN SMALL LETTER O WITH CIRCUMFLEX
COMBINING HOOK ABOVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G
'Tổng'
编码为Windows-1258并解码为UTF-8生成四个 Unicode代码点:
LATIN CAPITAL LETTER T
LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G
区别在于第一种是使用ổ
的两个代码点的非规范化形式。第二个使用单个代码点作为组合字符(规范化形式)。它们在视觉上是相同的。
这是第三个'Tò‚̀‰ng'
,在上面使用的编码/解码后变为六个 Unicode字符:
LATIN CAPITAL LETTER T
LATIN SMALL LETTER O
COMBINING CIRCUMFLEX ACCENT
COMBINING HOOK ABOVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G