我们有一个写入utf-8基本编码的应用程序,它支持utf-8 BMP(3字节)。但是,需要支持代理项对。
我在某处读过utf-8不支持代理字符。这是真的吗?
如果是,那么让我的应用程序使用utf-16的默认编码而不是utf-8的步骤是什么?
我没有代码片段,因为整个应用程序是通过记住utf-8而不是代理字符来编写的。
我需要在整个代码中更改哪些项目才能获得utf-8中代理项对的支持。或者将默认编码更改为UTF-16。
答案 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出站。