我在网络上上传了文件名“SchränkeWintsch.pdf”。 文件名保存在XML文件中,如下所示:
<File>Schra?nke Wintsch.pdf</File>
如果我在c#中调试此代码,然后手动添加ä,则可以正确保存。
<File>Schra?nke Wintsch-ä.pdf</File>
好的,我知道这是一个编码问题。 但是,为什么相同的ä字符用不同的字符代码表示(图2中的示例)?
答案 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