【发布时间】:2021-04-20 17:15:59
【问题描述】:
我正在研究一个字符串反转义函数,它将像 \uxxxx(其中 xxxx 是十六进制值)这样的文字序列转换为相应值的字节。我打算让函数获取xxxx序列的前两个字符,计算字节值,并与第二个序列相同。
但是我遇到了一个意外的结果,即文字类型的 UTF-8 字符。以下说明了我的问题:
#include <stdio.h>
int main()
{
unsigned char *str1 = "abcĢ";
unsigned char *str2 = "abc\x01\x22";
for (unsigned i = 0; i < 5; i++)
printf ("String 1 character #%u: %x\n", i, str1[i]);
for (unsigned i = 0; i < 5; i++)
printf ("String 2 character #%u: %x\n", i, str2[i]);
return 0;
}
输出:
String 1 character #0: 61
String 1 character #1: 62
String 1 character #2: 63
String 1 character #3: c4
String 1 character #4: a2
String 2 character #0: 61
String 2 character #1: 62
String 2 character #2: 63
String 2 character #3: 1
String 2 character #4: 22
Unicode 字符 Ģ 的 e 十六进制值为 \x0122,因此我希望字节 #3 和 #4 分别为 \x01 和 x22。
c4 和 a2 来自哪里?我想我不明白字符串中的多字节字符是如何用 C 编码的。任何帮助将不胜感激。
【问题讨论】:
-
c4,a2是Ģ(U+0122) 的 UTF-8 字节序列 带有 Cedilla 的拉丁文大写字母 G -
那么我的问题是,将
c4a2转换为0122并返回的逻辑是什么? -
当然,如果有人知道将文字
"\\u0122"转换为"\u0122"的现成函数,那将很好地解决我的问题......不要试图重新发明轮子。 -
UTF8 不仅是字符的序数,它还编码了表示该字符所需的字节数。
-
好的;那么您需要编写需要反斜杠、小写 U 和 4 个十六进制数字(任何一种情况)的代码,并且您需要将 4 个十六进制数字转换为 16 位无符号整数或一些更大的类型(32 位
int,可选unsigned)。不是那么难。注意必须有4个十六进制数字;这是一个硬性要求;三个或更少是没有明确解释的无效序列(错误)。额外的十六进制数字无关紧要;它们超出了\u转义序列的范围(但不得转换;因此,strtol()不可用,除非您将 4 位数字提取到字符串中)。