gpt4 book ai didi

c - GCC 和 CLang 无法识别 Unicode 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:40 24 4
gpt4 key购买 nike

我正在向 GCC 传递一个 UTF-32 字符串,它提示无效的多字节或宽字符。

我在 Clang 中对此进行了测试,但我收到了相同的错误消息。

我最初是用 MSVC 写的语句,它工作正常。

这是断言语句。

 assert(utf_string_copy_utf32(&string, U"¿Cómo estás?") == 0);

这是声明。

int utf_string_copy(struct utf_string * a, const char32_t * b);

编译命令如下:

cc -Wall -Wextra -Werror -Wfatal-errors -g -I ../include -fexec-charset=UTF-32 string-test.c libutf.a -o string-test

我是否假设 GCC 只能通过转义序列识别 Unicode 字符?

或者我误解了 GCC 和 CLang 是如何识别这些字符的。

编辑 1

这是错误信息。

string-test.c: In function ‘test_copy’:
string-test.c:46:61: error: converting to execution character set: Invalid or incomplete multibyte or wide character
assert(utf_string_copy_utf32(&string, U"�C�mo est�s?") == 0);

编辑 2

现在我更困惑了,因为我试图在一个更小的例子中重现这个错误。

#include <uchar.h>
#include <stdlib.h>
#include <stdio.h>

static size_t test_utf8(const char * in){
size_t len;
for (len = 0; in[len]; len++);
return len;
}

static size_t test_utf32(const char32_t * in){
size_t len;
for (len = 0; in[len]; len++);
return len;
}

int main(void){
size_t len;

len = test_utf8(u8"¿Cómo estás?");
printf("utf-32 length: %lu\n", len);

len = test_utf32(U"¿Cómo estás?");
printf("utf-32 length: %lu\n", len);

return 0;
}

这打印:

utf-8 length: 15
utf-32 length: 12

这再次证实了我最初认为它的工作方式。

所以我想这意味着我正在使用的库代码中某处存在问题。但我仍然不知道发生了什么。

最佳答案

我想通了这个问题。

我对两个字符串文字(破坏原始代码的字符串文字和正常工作的字符串文字)进行了十六进制转储。

这是损坏的字符串文字(我在 Windows 上写的):

00000000: 5522 bf43 f36d 6f20 6573 74e1 733f 220a  U".C.mo est.s?".

这是工作字符串文字(我在 Ubuntu 机器上写的):

00000000: 5522 c2bf 43c3 b36d 6f20 6573 74c3 a173  U"..C..mo est..s
00000010: 3f22 0a ?".

虽然它们在代码编辑器中看起来完全一样,而且它们都有 U 前缀,但它们在源代码中的编码方式不同。

虽然我不太确定哪种编码是哪种,但我从中了解到,检查文字的源代码编码非常、非常重要

编辑 1

正如@melpomene 在评论中指出的那样:

损坏的编码是Windows-1252 .

工作编码是UTF-8 .

关于c - GCC 和 CLang 无法识别 Unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42472105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com