2个不同的UTF-8编码数据如何生成相同的Unicode字符串?

时间:2017-09-20 05:18:51

标签: unicode encoding utf-8

我对此知之甚少,并希望寻求帮助。我使用的语言是C#。

我有2个单词被编码为UTF-8 CSV文件:

  1. TĂ´̀‰ng
  2. Tổng
  3. 我创建了一个带有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有什么不同?

1 个答案:

答案 0 :(得分:1)

您的Encoding.DefaultWindows-1258(越南语)。

用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
相关问题