我在文件编码方面遇到了一个奇怪的问题。
我有一个多语言网站;用户可以通过网站本身的下拉菜单进行设置,默认值为德语。
当用户登录时,根据语言(字符集、代码页和 LCID)设置一些设置。在这一点上,我还想指出,我所有的文件都是 ANSI 编码的。
最近,我不得不做出一些改变。
所以我启动Visual Studio 2010
,编辑有问题的文件并使用 Filezilla 将它们上传到我的服务器。
现在,突然之间,德语变音符号 ( Ää, Öö, Üü, ß
) 显示不正确(类似于ä
) - 但仅在我使用 VS2010 打开的文件上。
我检查了网站本身的字符集,并将其显示为Response.CharSet
and it ISO-8859-1
is ,这是正确的。
所以我尝试了一些转换notepad++
,但没有成功。
我知道将字符集设置为UTF-8
可以解决这个问题,但是a)字符集是从数据库值设置的,b)它在其他语言中有点搞砸了。
2 回答
您正在显示一个带有 iso-8859-1 视图的 utf-8 编码文件。通常你只想看到一个字符,但为什么你看到的是两个而不是一个?这是因为在 utf-8 中,带有“两个点”的德语小“a”字母是带有 utf-8(0xC3 和 0xA4)的 2 字节序列。如果它没有显示为 utf-8 而是显示为 iso-8859-1 编码 - 这意味着一个字节一个字符 - 你会得到你所提到的。您将获得作为单个 iso-8859-1 字符的起始字节 0xC3 和作为单个 iso-8859-1 字符的后续字节 0xA4。在 utf-8 中,这个 2 字节序列必须通过提取 startbyte 的有效负载位和以下字节来解码,如下所示:
起始字节:11000011
后续:10100100
所以必须去掉 110 个起始字节,所以剩下 11 个。所以后面的 10 个字节必须被剥离,所以剩下 100100。
链接在一起就变成了 11100100,它是十进制的 228,应该等于德语字符 'a with two dot' unicode codepoint。
我建议让编码保持原样,utf-8。只是查看器/编辑器的编码应该将 utf-8 编码文件显示为 utf-8 而不是 iso-8859-1。使用 utf-8 配置查看器/编辑器。换句话说,根据文件内容的编码(在您的情况下是 utf-8 而不是 iso-8859-1)配置查看器/编辑器的编码。
要转换您的文件或检查它们的特定编码,只需使用madedit。madedit 有一个内置的十六进制编辑器,它在 utf-8 序列周围包裹一个矩形,在右侧仅显示一个字符(编码的代码点)。在 utf-8 编码文件中识别单字节字符和/或 2/3/4 字节序列很容易。它还在 3 字节 utf-8 BOM(如果有)周围包裹了一个矩形。
编码问题有几个失败点:
- 检查模板文件编码
- 检查响应编码
- 检查数据库编码
检查它们是否与您要输出的内容一致。
另请注意,Notepad++ 具有“编码为...”和“转换为...”
第一个读取文件作为指定的编码,第二个读取文件并将其写回选定的编码(更改文件)