【问题标题】:wxWidgets and UnicodewxWidgets 和 Unicode
【发布时间】:2011-01-02 12:02:26
【问题描述】:

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

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

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

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

  3. 我有数千个字符串文字。我必须在每一个前面加上'L'吗? ( wxString foo("foo") --> wxString foo(L"foo") )

  4. 如果是这样,有人在 ca. 500 个 .cpp 文件? (请!=))

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

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

  7. 我进行了一些文本处理(比较、字符串查找等) - unicode 与 ansi 是否存在逻辑差异?

  8. 使用 Unicode 是否会对性能产生显着影响?

谢谢! 温迪

【问题讨论】:

    标签: unicode wxwidgets


    【解决方案1】:

    解决一些您的问题……

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

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

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

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

    • 我进行了一些文本处理(比较、字符串查找等) - unicode 与 ansi 是否存在逻辑差异?

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

    • 使用 Unicode 是否会对性能产生显着影响?

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

    【讨论】:

      【解决方案2】:
      1. http://www.wxwidgets.org/about/i18n.php 上有一个韩语 .po 文件,用于 wxWidget 自己的字符串。如果您的应用程序在使用该文件时正确显示 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,因为这些方案更简单。这是大小与速度的权衡。

      【讨论】:

      • 关于第 3 点:使用字符串字面量初始化的 wxstring 在 unicode 模式下如果没有 'L' 则无法编译
      • @wendy_44 没错。另一方面,用 'L' 字符串字面量初始化的 wxString 不能在 ANSI 模式下编译。现在,在您尝试 unicode 构建之前,测试我在 1. 中建议的内容,看看是否需要 unicode 构建(我怀疑不需要)。如果您毕竟想要构建一个 unicode,请将 _() 用于应翻译的文字字符串,将 wxT() 用于不应翻译的文字字符串。这两个宏确保构建的 unicode 和构建的 ansi 都会成功。
      • 对 5 的回答:(docs.wxwidgets.org/trunk/…)例如,臭名昭著的(由于他们造成的混乱)宏 wxT() 和 _T() 根本不需要不再。基本上,您可以从任何使用它们的代码中删除它们。
      【解决方案3】:

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

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

      3.我有成千上万的字符串文字。我必须在每个前面 他们每个人都带有'L'? ( wxString foo("foo") --> wxString foo(L"foo") )

      如果您必须在 3.0 之前将 unicode 与 wxwidgets 一起使用,则必须这样做。但是不要在wxwidgets下使用'L',使用wxT("foo")

      4.如果是这样,有人在 ca. 500 个 .cpp 文件?

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

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

      但要小心!将替换所有字符串文字,#include "file.h" 与 #include wxT("file.h")

      1. wxWidgets 3.0 会发生这种变化吗?

      是的。请参阅上面的答案/引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-19
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        相关资源
        最近更新 更多