代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

Unicode内部“精简”编码转换器

  •  2
  • Brent Arias  · 技术社区  · 15 年前

    Windows提供编码转换函数(“MultiByteToWideChar”和“WideCharToMultiByte”),这些函数能够进行UTF-8到UTF-16的转换。但我看到有人提供了自己开发的30到40行函数,它们声称也可以执行UTF-8/UTF-16编码转换。

    我的问题是,这么小的转换器有多可靠?如此少量的代码能否处理诸如转换UTF-16代理项对之类的问题(例如<D800(DC00>)转换成UTF-8单四字节序列(而不是错误地转换成一对三字节序列)?他们能正确地发现“未配对”的代理输入,并提供一个错误吗?

    简言之,这么小的转换器仅仅是玩具,还是可以认真对待?既然如此,为什么unicode.org似乎没有提供实现这种转换的算法方面的建议呢?

    5 回复  |  直到 15 年前
        1
  •  2
  •   Hans Passant    15 年前

        2
  •  2
  •   Stack Overflow is garbage    15 年前

    在UTF-8、-16和-32之间转换是一个非常简单的过程。这很简单,因为它们都使用相同的“字符集”,只是使用不同的编码来表示每个代码点。

    棘手的部分是转换成非UTF格式。MultiByteToWideChar可以做到这一点。一个15行的转换函数不能。

        3
  •  1
  •   Adrian McCarthy    15 年前

    是的,生产质量功能可以这么短。我已经为UTF-8编写了全面、错误检查、防御、迂腐、可理解、防弹的转换;UTF-32和UTF-32到UTF-8,每行大约50行,带有注释(但不包括单元测试)。有更密集的编码样式,可能在30-40行中为每个函数执行相同的操作。还有一些快捷方式,您可以直接将UTF-8转码到UTF-16或从UTF-16转码到UTF-8,而不需要使用UTF-32。

        4
  •  1
  •   Nemanja Trifunovic    15 年前

    你是正确的-大多数“复制/粘贴”例程,你可以在互联网上找到不执行有效性检查。

    如果您想要一个执行这些检查的小型库,请看 UTF8-CPP

        5
  •  0
  •   Robert Tuck    15 年前

    Unicode网站上曾经有一个C格式的转换器示例 ftp://ftp.unicode.org/Public/PROGRAMS/CVTUTF/ 但它被移除了。我不知道为什么,因为这是非常有用的,并有一个非限制性的许可证-你会问他们。

    它很小,我用过。我相信它处理代理对正确,但由于我没有在我面前的代码,我不能发誓它。我相信你可以在网上其他地方找到它的副本。

    缺点是,如果您必须在非unicode字符集之间进行转换或转换,那么它就没有用了,因为它只在UTF变体之间进行转换。