如何转义utf-8并将utf-8代码转换为字节

时间:2019-04-19 10:18:39

标签: c string utf-8

我需要将字符串(char [])转换为带有Unicode转义符的字符串(格式为\ u0105)。我编写unicode代码以从文件示例转换字符串:

“±ćżźóÓŻŹĆĄŚśƐƑƁƂ” =>“ \ u0105 \ u0107 \ u017C \ u017A \ u00F3 \ u00D3 \ u017B \ u0179 \ u0106 \ u0104 \ u015A \ u015B \ u0190 \ u0191 \ u0181 \ u0182 \ u0401 \ u0402”。

现在我需要反写,例如:“ \ u0105” =>“±”(char [] = {0xC4,0x85})。

如何执行此操作(仅使用C)?
假设我在WeekId

中有utf-8代码

这里是我的代码,用于将字符串转换为unicode转义:

uint32_t code = 0x0105;

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果可以搜索,我将其写为有问题的代码的延续:

char result[] = "\u0105\u0107\u017C\u017A\u00F3";

char* resultStr = (char*)malloc(sizeof(char) * currentIndex + 1);
size_t reIndex = 0;

for (size_t i = 0; i < strlen(result); i++) 
{
    if (result[i] == '\\')
    {
        if (result[i + 1] != '\0')
        {
            i++;
            switch (result[i])
            {
                case 'u':
                    if (result[i + 1] != '\0' && result[i + 2] != '\0' && result[i + 3] != '\0' && result[i + 4] != '\0')
                    {
                        const char hexstring[5] = {result[i + 1], result[i + 2], result[i + 3], result[i + 4], '\0'};
                        uint32_t code = (uint32_t)strtol(hexstring, NULL, 16);
                        printf ("Code = 0x%X\n", code);
                        uint8_t firstByte = 47;
                        uint8_t secondByte = 0;

                        for (size_t i = 1; i < 48; i++)
                        {
                            if (unicode[i] > code)
                            {
                                firstByte = i - 1;
                                secondByte = (uint8_t)(code - unicode[i - 1]);
                                break;
                            }
                        }

                        firstByte |= 0xC0;
                        secondByte |= 0x80;
                        resultStr[reIndex++] = (char)firstByte;
                        resultStr[reIndex++] = (char)secondByte;
                        i += 4;
                    }
                break;
            }
        }
        else
        {
            //Error
        }
    }
    else
    {
        resultStr[reIndex++] = result[i];
    }
}

resultStr[reIndex] = '\0';
printf("Result = %s\n", resultStr);

这需要重构并添加一些功能,例如句柄“ \ n”,“ \ t”,“ \ r”,但又轻巧又快速。

有人有更好的主意吗?