在C#.NET应用程序上显示ñ

时间:2009-01-10 02:16:11

标签: c# unicode localization character-encoding

我有本地化问题。

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

对于我们对此功能的测试,我们想要更改一个按钮以包含具有ñ字符的文本,该字符以西班牙语和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字符之一。

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

感谢您的帮助!

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

你是怎么读字符串的?

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

using(StreamReader sr = new StreamReader(File.Open("file.txt", FileMode.Open), Encoding.UTF8))
{
// add your string to dictionary
}

答案 2 :(得分:1)

我的篇幅很短guide to debugging Unicode problems。它的目标是从数据库中提取文本,但同样的原则也适用。

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

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

然后在code charts on unicode.org中查找角色。我怀疑你想要U + 00F1,但可能有另一个类似的角色有不同的代码点 - 我之前被这个愚弄了。

答案 3 :(得分:0)

前几天我遇到了类似的问题 - 请参阅Unicode characters not showing in System.Windows.Forms.TextBox。我能够通过将TextBox更改为RichTextBox来修复。

答案 4 :(得分:0)

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

我不知道这是否有效,但可以提供帮助。

答案 5 :(得分:0)

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

当我开始研究同事的上帝知道什么编辑器的编码时,我已经被这件事所困扰。

我非常肯定并且假设你所有的api调用都是utf-8,所以你的所有文本都被解释为utf-8,即使它不是。

答案 6 :(得分:0)

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