【问题标题】:Designing an application for UTF-8 or UTF-16 usage为 UTF-8 或 UTF-16 使用设计应用程序
【发布时间】:2012-02-16 01:17:18
【问题描述】:

我正在开发一个主要供英语和西班牙语读者使用的应用程序。但是,将来我希望能够支持更多的扩展语言,例如日语。在考虑程序的设计时,我在 UTF-8 与 UTF-16 与多字节之间碰壁了。我想编译我的程序以支持 UTF-8 或 UTF-16(用于使用中文等语言时)。为此,我在想我应该拥有诸如

之类的东西
#if _UTF8
typedef char char_type;
#elif _UTF16
typedef unsigned short char_type;
#else
#error
#endif

这样,以后当我使用 UTF-16 时,我可以切换 #define (当然,对于 sprintf 等事物,我可以使用相同类型的 #if/#endif)。我有自己的自定义字符串类型,所以也可以使用这种情况。

在上面提到的场景中用我的“char_type”替换每次使用“char”的单次使用会被认为是“坏主意”吗?如果是这样,为什么它被认为是一个坏主意,我该如何实现我上面提到的?

我想使用其中一个的原因是由于内存效率。如果我不使用它,我宁愿不要一直使用 UTF-16。

【问题讨论】:

  • 那么英语和西班牙语是“基本”语言,而日语是“扩展”语言?例如,基本医疗保健与牙齿美白?
  • 别打扰了。如果可以的话,使用char32_t 将您的内部表示设为UTF32,并提供干净的接口。
  • 重点是你不应该认为任何一种语言比任何其他语言都更基础。只需从一开始就设计您的程序以处理所有输入,您将获得更清晰的结果。 (另外,永远不要在内部使用 UTF16,因为它是一种痛苦而没有收获。它仍然是可变长度的,并且它增加了其他问题。您无需担心程序内存中的空间。)
  • 我会提高内存效率,而不是总是使用尽可能大的值
  • 我还没有遇到过 wchar_t 让我的生活更轻松的情况。它一直造成混乱并增加了复杂性。

标签: c++ algorithm unicode utf-8 utf-16


【解决方案1】:

UTF-8 可以表示每个 Unicode 字符。如果您的应用程序正确支持 UTF-8,那么您就可以胜任任何语言。

请注意,如果您正在编写 Windows 应用程序,Windows 的本机控件没有用于在其中设置 UTF-8 文本的 API。但是,很容易制作一个在内部对所有内容都使用 UTF-8 的应用程序,并在 Windows 中设置文本时转换 UTF-8 -> UTF-16,并在从 Windows 获取文本时转换 UTF-16 -> UTF-8。我已经完成了,它工作得很棒,而且比编写 WCHAR 应用程序要好得多。转换 UTF-8 16 很简单; Windows 有它的 API,或者您可以在自己的代码中找到一个简单的(一页)函数来执行此操作。

【讨论】:

  • 如果我应该总是使用 UTF8,那么为什么会有 UTF16,或者为什么在某些想法中有选项,比如 Visual Studio 用于“Unicode 或多字节”?
  • @chadb,“多字节”选项适用于仍然使用代码页的旧程序。由于 Windows 在内部使用 UTF-16,因此没有理由使用它。就 Windows 而言,“Unicode”表示“UTF-16”,这是一种耻辱,因为 UTF-8 更适合大多数用途。
  • 不幸的是,在 UTF8 流行之前,微软已经完成了所有的 Unicode 工作。
  • Microsoft 在 Windows 2000 中切换到 UTF-16。在此之前,Windows NT4 使用 UCS-2。 Windows 必须使用 UTF-16 来保持与现有代码的向后兼容,并且一直持续到今天。
  • @chadb: 紧急阅读programmers.stackexchange.com/questions/102205/…。还有我对 StilesCrisis 的巨大 +1!
【解决方案2】:

我相信选择 UTF-8 足以满足您的需求。请记住,上面的 char_type 在两种编码中都小于一个字符。

您不妨看看这个讨论:https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful,了解不同类型的流行编码的好处。

【讨论】:

  • 那我怎样才能在我的代码中有效地使用 UTF8 呢?我需要将“char_type”用作与“char”不同的 typedef 吗?如果有,应该是哪种类型?
  • 您只需使用包含 UTF8 数据的常规 char 字符串。不需要新类型。
  • 同意SC;只记住 char 不是一个字符(它更少)。
  • “char 不是一个字符(它是少)”,我喜欢这个双关语。
【解决方案3】:

这基本上是 Windows 对 TCHAR 所做的事情(除了 Windows API 将 char 解释为“ANSI”代码页而不是 UTF-8)。

I think it's a bad idea.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-20
    • 2015-09-21
    • 1970-01-01
    • 2019-05-15
    • 2010-10-19
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多