1

我有一个本地化问题。

我的一位勤奋的同事用字典中包含的常量替换了整个应用程序中的所有字符串。一旦用户选择一种语言(默认为英语,但目标语言是德语、西班牙语、法语、葡萄牙语、普通话和泰语),该词典就会在其中放置各种字符串。

为了测试此功能,我们希望更改一个按钮以包含具有 ñ 字符的文本,该字符以西班牙语和 Arial Unicode MS 字体(我们在整个应用程序中使用)显示。

问题是,ñ 显示为一个方块,就好像程序不知道如何显示它一样。当我调试从磁盘读取的特定字符串时,调试器也会将该字符报告为方块。

那么失败在哪里呢?我觉得可能有几个地方:

1) 记事本可能无法识别 unicode,因此此处显示的 ñ 与 vs2008 所期望的不同,因此程序将字符解释为正方形(编辑:记事本显示与 vs 相同的字符;即,它们都显示ñ. 在同一个地方。)。

2) vs2008 无法处理ñ。我觉得非常非常难以相信。

3)文字读入正确,但是vs2008的默认字体无法显示,这也是调试器显示正方形的原因。

4)文本没有正确读入,我应该使用常规 StreamReader 以外的东西来获取字符串。

5) 文本被正确读入,但 C# 中默认的 String 类处理不好。我觉得非常非常难以相信。

6) 我拥有的 Arial Unicode MS 版本没有ñ,尽管它被http://www.fileinfo.info列为 50k 个字符之一。

还有什么我可以遗漏的吗?

谢谢你的帮助!

4

7 回答 7

3

我会说,最肯定记事本是罪魁祸首。记事本不能很好地处理 unicode 字符。如果您想手动编辑此文件,请使用可以处理 unicode 的Notepad++,并确保将文件保存为 UTF-8。您可能只使用 VS 来编辑文件,而完全忘记记事本或 Notepad++。.Net 和 Visual Studio 实际上非常擅长处理重音字符。默认情况下,所有字符串都是 UTF-8,所以问题几乎肯定出在记事本上。

于 2009-01-10T02:25:20.467 回答
1

你是如何阅读字符串的?

您是否尝试过像这样读取文本文件(编码设置为 UTF8):

using(StreamReader sr = new StreamReader(File.Open("file.txt", FileMode.Open), Encoding.UTF8))
{
// add your string to dictionary
}
于 2009-01-10T03:33:35.913 回答
1

我有一个关于调试 Unicode 问题的简短指南。它的目标是从数据库中获取文本,但同样的原则通常适用。

IMO 最重要的起点是在字符串仅显示一个框时知道它的实际内容。将内容转储到控制台,代码如下:

static void DumpString (string value)
{
    foreach (char c in value)
    {
        Console.Write ("{0:x4} ", (int)c);
    }
    Console.WriteLine();
}    

然后在 unicode.org 上的代码图表中查找该字符。我怀疑你想要 U+00F1,但可能还有另一个类似的字符具有不同的代码点——我以前被愚弄过。

于 2009-01-10T07:31:41.657 回答
0

前几天我遇到了类似的问题 - 请参阅System.Windows.Forms.TextBox 中未显示的 Unicode 字符。我能够通过将 TextBox 更改为 RichTextBox 来修复。

于 2009-01-10T02:24:57.113 回答
0

在分配 button.Text 属性并为正确的 IFormatProvider 提供西班牙语 CultureInfo 对象时,您是否尝试过使用 String.Format?

我不知道这是否会产生影响,但可能会有所帮助。

于 2009-01-10T02:26:04.800 回答
0

你检查过你的文件编码真的是 utf-8 吗?可能不适用于默认的 vs2008 安装,但 IDE 可能会检测您的操作系统的默认语言环境(或文件系统编码)并为您的所有文件设置匹配的非 utf-8 编码。您可能想尝试使用双重编码的混乱(您经常在网络上遇到)“ñ”,而无需更改设置中的任何内容来测试您的编码不匹配。

当我开始编写同事的上帝知道什么编辑器在什么编码代码上工作时,我被这件事咬住了。

我很确定并假设您的所有 api 调用都支持 utf-8,因此您的所有文本都被解释为 utf-8,即使它不是。

于 2009-01-10T13:51:21.033 回答
0

要正确读取西班牙语字符(ñ、á、é 等),您可以尝试使用 Codepage 1252 进行编码。

于 2010-05-31T22:24:01.083 回答