wxWidgets和Unicode

时间:2011-01-02 12:02:27

标签: unicode wxwidgets

我想在我的 - 相当大的 - wxwidgets应用程序中使用韩语翻译。该应用程序使用wxwidgets翻译框架,该框架基于gettext。

我有法语,德语和俄语的翻译工作。无论如何我想去unicode,但我的第一个问题是:

  1. 我的应用程序是否需要unicode支持才能显示韩语和日语?

  2. 如果是这样, - 只是为了兴趣 - 俄罗斯为什么没有工作,因为他们有西里尔字母?

  3. 我有成千上万的字符串文字。我必须在每个前面加上'L'吗? (wxString foo(“foo”) - > wxString foo(L“foo”))

  4. 如果是这样,有人建立一个正则表达式或sed或perl脚本来执行此操作。 500 .cpp文件? (pleeze!=))

  5. 这会在wxWidgets 3.0中发生变化吗?

  6. Unicode问题概述:我在许多描述性和技术性方面使用这些字符串文字..作为显示文本以及GLSL着色器的部分以及XML。这些API将char * / const char *作为函数参数,因此我的内部wxString表示在这些区域中无关紧要。理论与实践:这是真的吗?分享一些经验,有人吗?

  7. 我做了一些文本处理(比较,字符串查找等) - unicode与ansi有任何逻辑差异吗?

  8. 使用Unicode时是否会产生可重映射的性能?

  9. 谢谢! 温迪

3 个答案:

答案 0 :(得分:2)

解决一些的问题......

  
      
  • 我的应用程序是否需要unicode支持才能显示韩语和日语?
  •   
  • 如果是这样, - 只是为了兴趣 - 俄罗斯为什么没有工作,因为他们有一个西里尔字母?
  •   

俄语适合单字节字符集,就像西欧语言一样(尽管它是一个不同的字符集)。韩国人和日本人(和中国人)没有。有很多解决方法,但我所知道的最优雅的是使用Unicode,因此您不需要为每个语言环境重建应用程序;只需更改其消息目录。

  
      
  • Unicode问题概述:我以许多描​​述性和许多技术方式使用这些字符串文字..作为显示文本以及GLSL着色器的部分以及XML。这些API将char * / const char *作为函数参数,因此我的内部wxString表示在这些区域中无关紧要。理论与实践:这是真的吗?分享一些经验,有人吗?
  •   

只有要向(非技术)用户显示的字符串才需要本地化,因此它们是唯一必须使用Unicode的字符串。最常见的方法是使用UTF-8(这是一种特殊的Unicode编码方式),因为这意味着ASCII字符串 - 在程序内部传递的最常见类型 - 完全相同,这简化了很多事情。不足之处在于您不再对字符串进行廉价索引,因为并非所有字符都与字节的长度相同。这可以是从非问题到正确的皇家阻碍PITA的任何事情,取决于程序正在做什么。

  
      
  • 我做了一些文本处理(比较,字符串查找等) - unicode与ansi有任何逻辑差异吗?
  •   

比较工作正常,简单的字符串查找也是如此。其他操作(例如,获取字符串的20 th 字符,或者计算出你找到子字符串的字符串中有多少字符)是令人讨厌的,因为你没有恒定的字符宽度。使用宽字符可以减轻恶意,但是它们不太适合用于外部数据(它们会引入字节顺序的潜在问题,除非你使用字节顺序标记,这就是另一个问题)。

  
      
  • 使用Unicode会对性能产生任何影响吗?
  •   

取决于你的确切行为。使用UTF-8,如果你现在主要处理ASCII文本,那么对于大多数操作来说,你几乎不会遇到性能问题。对于宽字符,你会为每个字符占用更多内存,这自然会产生性能影响(但这可能是可以接受的,因为它确实意味着你有恒定时间索引)。

答案 1 :(得分:2)

  1. 对于wxWidget自己的字符串,http://www.wxwidgets.org/about/i18n.php上有一个韩文.po文件。如果您的应用程序在使用该文件时正确显示wxWidget自己的字符串,则它不需要Unicode支持来显示韩语和日语。
  2. ISO-8859-5是一个8位字符集,带有西里尔字母。
  3. 仅当1.不能产生正确的结果。但是如果你想翻译字符串,你应该使用_()
  4. 我不知道。
  5. wxWidgets 3.0不会有单独的Unicode和ANSI构建。 2.9.1也没有。
  6. 这取决于您如何使用参数。 C-和C ++ - 函数通常在字符串的表示上运行,并且不知道任何特定的字符编码。特别是你认为是角色以及节目认为角色的东西可能是不同的东西。
  7. 见6.
  8. 我不知道,但许多工具包使用UTF-16或UTF-32而不是UTF-8,因为这些方案更简单。这是一个规模 - 速度的权衡。

答案 2 :(得分:0)

  

1.我的应用程序需要unicode支持才能显示韩语和日语   语言

感谢Oswald,我发现你可以在你的wxwidgets应用程序中使用unicode进行韩语翻译。更改(至少在windows下)设置非unicode感知程序。但我仍然需要检查这是否足以满足整个应用程序。

  

3.我有数以千计的字符串文字。我必须在每个前面加上   他们每个人都有'L'? (   wxString foo(“foo”) - > wxString   foo(L“foo”))

如果必须在3.0之前使用带有wxwidgets的unicode,则必须这样做。但是不要在wxwidgets下使用'L',使用wxT(“foo”)

  

4.如果是,有人建立了一个正则表达式或sed或perl脚本来执行此操作。 500 .cpp文件?

我做过,至少在Visual Studio下搜索和替换:

Search: {"([^"]*)"}
Replace: wxT(\1)

但要小心!将使用#include wxT(“file.h”)替换所有字符串文字,#include“file.h”

  
      
  1. 这会改变wxWidgets 3.0吗?
  2.   

是。见上面的答案/引用。