当前位置: 首页 > 知识库问答 >
问题:

用C/C转义unicode字符

宦飞
2023-03-14

我需要将输入字符串中的unicode字符转义为UTF-16或UTF-32转义序列。例如,输入字符串文字< code >“吃,喝,愛" 应该转义为< code >“吃喝,\ u611b”。以下是排序表中的规则:

Escape | Unicode码位

“\u” 十六进制 十六进制 十六进制|U 到 U FFFF 范围内的 Unicode 代码点(包括与编码的十六进制值相对应)。

'\U'HEX HEX HEX-HEX HEX-HEX-HEX-HEX|与编码的十六进制值相对应的范围为U 0到U 10FFFF(含U 10FF)的Unicode码位。

一般来说检测Unicode字符很简单,因为如果ASCII,第二个字节为0:

L"a" = 97, 0

,这不会被转义。对于 Unicode 字符,第二个字节永远不会为 0:

L"愛" = 27, 97

,转义为\u611b。但是如何检测UTF-32是一个字符串,因为它的转义方式不同于具有8个十六进制数的UTF-16?

它不像检查html" target="_blank">字符串的大小那么简单,因为UTF-16字符是多字节的,例如:

L"प्रे" = 42, 9, 77, 9, 48, 9, 71, 9

我的任务是转义未转义的输入字符串文字,如吃,喝,爱,并将它们以转义的文字形式存储到磁盘吃,喝,\u611b(UTF-16示例)如果我的程序找到一个UTF-32字符,它也应该以\U8902611b(UTF-32示例)的形式转义这些字符,但是我找不到某种方法来知道我是在处理输入字节数组中的UTF-16还是UTF-32。那么,我如何在wchar_t字符串或字节数组中可靠地区分UTF-32和UTF-16字符呢?

共有1个答案

艾泽语
2023-03-14

你的问题中有很多问题,我会试着回答最重要的问题。

Q、 我有一个C字符串,如“吃,喝,愛“,它是UT8-8、UTF-16还是UTF-32字符串?
a。这是实现定义的。在许多实现中,这将是UTF-8字符串,但这不是标准强制要求的。请参阅您的文档。

问:我有一个宽的C字符串,比如L"吃、喝、爱",它是UT8-8、UTF-16还是UTF-32字符串?这是实现定义的。在许多实现中,这将是UTF-32字符串。在其他一些实现中,它将是UTF-16字符串。标准都没有强制要求。咨询您的留档。

问:我如何拥有可移植的UT8-8、UTF-16或UTF-32 C字符串文字?
A.在C 11中有一种方法:

u8"I'm a UTF-8 string."
u"I'm a UTF-16 string."
U"I'm a UTF-32 string."

在C 03中,没有这样的运气。

问:字符串< code >“吃,喝,愛" 包含至少一个UTF-32字符?< br >答:不存在UTF-32(以及UTF-16和UTF-8)字符。还有UTF-32等。弦乐。它们都包含Unicode字符。

Q.什么是统一码字符?
一个。它是 Unicode 标准定义的编码字符集的元素。在C程序中,它可以用各种方式表示,最简单明了的是使用与字符的代码点相对应的单个32位整数值。(为了简单起见,我在这里忽略了复合字符,并将“字符”和“代码点”等同起来,除非另有说明)。

Q、 给定一个Unicode字符,如何对其进行转义
A.检查其值。如果它在256和65535之间,则打印一个2字节(4个十六进制数字)转义序列。如果大于65535,则打印一个3字节(6个十六进制数字)的转义序列。否则,按正常方式打印。

问:给定一个UTF-32编码的字符串,我如何将其分解为字符?
A.字符串的每个元素(称为代码单元)对应一个字符(代码点)。一个接一个地拿就行了。不需要做什么特别的事情。

问:给定一个UTF-16编码的字符串,我如何将其分解为字符?
A.0xD800到0xDFFF范围之外的值(代码单元)对应于具有相同值的Unicode字符。对于每个这样的值,打印一个普通字符或2字节(4个十六进制数字)转义序列。0xD800到0xDFFF范围内的值成对分组,每对代表U 10000到U 10FFFF范围内的单个字符(代码点)。对于这样的一对,打印一个3字节(6个十六进制数字)转义序列。要将一对(v1, v2)转换为其字符值,请使用以下公式:

c = (v1 - 0xd800) >> 10 + (v2-0xdc00)

请注意,该对的第一个元素必须在0xd800..0xdbff范围内,而第二个元素则在0xdc00..0xdfff范围内。否则,该对格式不正确。

问:给定一个UTF-8编码的字符串,我如何将它分解成字符?< br >答:UTF-8编码比UTF-16编码稍微复杂一些,我在这里就不赘述了。在网上有许多描述和示例实现,去找找吧。

Q、 我的L怎么了“प्रे“string?
A.它是由四个Unicode码位U 092A、U 094D、U 0930、U 0947组成的复合字符。注意,这与答案UTF-16部分中详细描述的用代理项对表示高位代码点不同。这是一种“字符”与“代码点”不同的情况。分别转义每个代码点。在这个抽象级别上,您处理的是代码点,而不是实际的字符。例如,当您为用户显示字符,或计算字符在打印文本中的位置时,字符就会发挥作用,但在处理字符串编码时,字符就不会发挥作用。

 类似资料:
  • 我需要读入带有unicode转义的标准ascii样式字符串,并将其转换为包含utf8编码等价物的std::字符串。因此,例如“\u03a0”(包含6个字符的std::字符串)应转换为包含两个字符的std::字符串,分别为0xCE和0xA0,以原始二进制格式。 如果有一个简单的答案使用icu或boost我会很高兴,但我还没有找到一个。 (这类似于将Unicode字符串转换为转义ASCII字符串,但注

  • 问题内容: 考虑以下代码 问题在于,SQL语句中的引号没有被转义。如果我使用PHP编程,则在将字符串插入SQL查询之前,将使用sqlite_escape_string之类的函数对字符串进行转义,但是我似乎找不到C ++中的等效函数。我可以构建自己的sqlite_escape_string之类的函数,但我确定必须已经编写/测试了一个… C ++是否有sqlite_escape_string()等效函

  • 字符集(Character Set)为每个字符分配了唯一的编号,我们不妨将它称为编码值。在C语言中,一个字符除了可以用它的实体(也就是真正的字符)表示,还可以用编码值表示。这种使用编码值来间接地表示字符的方式称为 转义字符(Escape Character)。 转义字符以 或者 开头,以 开头表示后跟八进制形式的编码值,以 开头表示后跟十六进制形式的编码值。 对于转义字符来说,只能使用八进制或者十

  • 问题内容: 想知道是否有一种简单的方法可以在Objective C中执行简单的HTML转义/转义。我想要的是这样的伪代码: 哪个返回 希望也转义所有其他HTML实体,甚至ASCII码(例如Ӓ等)。 Cocoa Touch / UIKit中有什么方法可以做到这一点? 问题答案: 包含以下解决方案。可可CF具有CFXMLCreateStringByUnescapingEntities函数,但在iPho

  • 问题内容: 在解析包含unicode转义序列的json字符串时,存在一个长期存在的错误。似乎需要修复该错误,这种错误可能很快就不会发生,因此我正在寻找一种在R中创建解决方法的方法,该方法在将序列提供给json解析器之前先取消序列化。 一些上下文:json数据始终是unicode,默认情况下使用,因此通常不需要转义。但是出于历史原因,json确实支持转义的unicode。因此json数据 和 是等效

  • 在JSON中,Unicode字符可以使用表示法进行转义。我假设显然是指十六进制的Unicode代码点。 但由于只有4位数字,这是否意味着无法转义