字符ä在同一字符串中以不同的字符代码表示

时间:2018-09-26 11:28:49

标签: c# asp.net .net

我在网络上上传了文件名“SchränkeWintsch.pdf”。 文件名保存在XML文件中,如下所示:

<File>Schra?nke Wintsch.pdf</File>

如果我在c#中调试此代码,然后手动添加ä,则可以正确保存。

<File>Schra?nke Wintsch-ä.pdf</File>

好的,我知道这是一个编码问题。 但是,为什么相同的ä字符用不同的字符代码表示(图2中的示例)?

Img 1

Img 2

3 个答案:

答案 0 :(得分:2)

您拥有的原始XML使用Unicode 'COMBINING DIAERESIS' code(int值776)来使用两个字符表示ä

(请注意,在您的帖子的?图片中,合并字符如何显示为<File>Schra?nke Wintsch.pdf</File>。)

776代码说将双点放在上一个字符(a)上方。

但是,您在ä中键入的位置已存储为代码为228的Unicode字符。

您需要回答的问题是:为什么原始源XML为什么使用“ Combining Diaeresis”字符而不是更常见的ä? (在不知道XML文件起源的情况下,我们无法回答该问题。)

顺便说一句,您可以使用string.Normalize()“归一化”这类字符,如以下程序所示:

using System;

namespace Demo
{
    static class Program
    {
        static void Main()
        {
            char[] a = {(char)97, (char)776};
            string s = new string(a);

            Console.WriteLine(s + " -> " + s.Length); // Prints a¨ -> 2

            var t = s.Normalize();
            Console.WriteLine(t + " -> " + t.Length); // Prints ä -> 1
        }
    }
}

请注意s的长度是2,但是t的长度只有1(并且包含单个字符ä)。

因此,您可以使用string.Normalize()来规范化这些意外字符,从而改善自己的状况。

答案 1 :(得分:1)

XML使用标头定义文档中使用的编码。看起来像这样。<?xml version="1.0" encoding="ISO-8859-9" ?>

如果附加字符串,请确保使用相同的编码,以避免不匹配。

测试附加的char字节,看看是否有帮助。

var en = Encoding.GetEncoding("ISO-8859-9");

en.GetString(Encoding.GetBytes("ä"));

答案 2 :(得分:0)

string.Normalize()是字符串“SchränkeWintsch-ä.pdf”的工作解决方案。因此它可以正确保存为SchränkeWintsch-ä.pdf