2

我尝试在 C 中解析一个 UTF-8 JSON 消息。我将以下代码传递给解析器:

char *text = "{\"mdl\":\"users\",\"fnc\":\"getuserslist\"}";

和所有的作品。但是如果消息有一个西里尔字符,我的两个解析器都说这个字符串是“无效的 UTF-8 字符串”。例子:

char *text = "{\"mdl\":\"пользователи\",\"fnc\":\"получитьсписокпользователей\"}";

我对 C 使用了 Jansson C 解析器和 CCAN JSON 解析器。在我的主要函数中,我有以下setlocale调用:

setlocale(LC_ALL, "ru_RU.utf8");

如何在其中使用西里尔字符获取有效的 UTF-8 字符串?

4

2 回答 2

3

源编码(用于对 C 源代码中的文本进行编码的编码)和目标编码(用于对运行时字符串进行编码的编码)之间的关系并不明显。有关此问题的更多讨论,请参阅此问题。

确保您的源编码是 UTF-8,并且编译器会保留它。

或者,您可以手动将字符串编码为 UTF-8,通过用反斜杠转义的 UTF-8 序列替换非 ASCII 字符来更加确定。

于 2013-05-02T12:34:25.150 回答
0

尝试将控制台设置为 UTF8 (cp 65001) 并将输出重定向到文件,而不是 setlocale(LC_ALL, "ru_RU.utf8")。

//Save As UTF-8 without BOM signature
#include<stdio.h>
#include<Windows.h>
int main(){
    SetConsoleOutputCP(65001);
    char *text = "{\"mdl\":\"пользователи\",\"fnc\":\"получитьсписокпользователей\"}";
    printf("%s",text);
}

我们可以使用西里尔字符获取有效的 UTF-8 字符串:

{"mdl":"пользователи","fnc":"получитьсписокпользователей"}
于 2013-09-30T13:56:22.697 回答