c ++:如何在utf8中支持代理字符

时间:2017-03-02 13:19:29

标签: c++ utf-8 internationalization utf-16 surrogate-pairs

我们有一个写入utf-8基本编码的应用程序,它支持utf-8 BMP(3字节)。但是,需要支持代理项对。

我在某处读过utf-8不支持代理字符。这是真的吗?

如果是,那么让我的应用程序使用utf-16的默认编码而不是utf-8的步骤是什么?

我没有代码片段,因为整个应用程序是通过记住utf-8而不是代理字符来编写的。

我需要在整个代码中更改哪些项目才能获得utf-8中代理项对的支持。或者将默认编码更改为UTF-16。

2 个答案:

答案 0 :(得分:3)

  

我们有一个写入utf-8基本编码的应用程序,它支持utf-8 BMP(3字节)。

为什么不是整个Unicode指令表(4个字节)?为什么仅限于3个字节?只有3个字节才能支持最多U + FFFF的代码点。 4个字节可以支持额外的1048576个代码点,一直到U + 10FFFF。

  

但是,需要支持代理项对。

代理对仅适用于UTF-16,而不适用于UTF-8甚至UCS-2(UTF-16的前身)。

  

我在某处读过utf-8不支持代理字符。这是真的吗?

用于编码代理的代码点可以用UTF-8进行物理编码,但是它们是由Unicode标准保留,并且在UTF-16编码之外使用是非法的。 UTF-8不需要代理项对,任何包含代理代码点的解码Unicode字符串都应该被视为格式错误。

  

如果是,那么让我的应用程序使用utf-16的默认编码而不是utf-8的步骤是什么?

我们无法回答这个问题,因为您没有提供有关项目设置方式,使用的编译器等信息。

但是,您不需要将应用程序切换为UTF-16。您只需更新代码以支持UTF-8的4字节编码,并确保在将16位数据转换为UTF-8时支持代理对。不要将自己限制在U + FFFF作为最高可能的代码点。 Unicode有许多代码点。

听起来您的代码在将数据转换为UTF-8或从UTF-8转换数据时只处理UCS-2。只需更新该代码以支持UTF-16而不是UCS-2,您应该没问题。

答案 1 :(得分:1)

  

我们有一个写入utf-8基本编码的应用程序,它支持utf-8 BMP(3字节)。但是,需要支持代理项对。

因此将utf-16编码的字符串转换为utf-8。这里的文档:http://www.cplusplus.com/reference/codecvt/codecvt_utf8_utf16/

  

如果是,那么让我的应用程序使用utf-16的默认编码而不是utf-8的步骤是什么?

错误的问题。在内部使用UTF-8。

  

我需要在整个代码中更改哪些项目才能获得utf-8中代理项对的支持。或者将默认编码更改为UTF-16。

见上文。将入站数据的UTF-16转换为UTF-8,并在必要时转换回UTF-16出站。