Я передаю 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
Это подтверждает то, как я изначально думал, что это работает.
Так что я предполагаю, что это означает, что где-то в коде библиотеки, которую я использую, есть проблема. Но я до сих пор понятия не имею, что происходит.
string-test.c:46:61: error: converting to execution character
в вопрос, почему длина отличается? Каков ваш фактический вопрос? - person Soren   schedule 26.02.2017u8"literals"
- person M.M   schedule 26.02.2017u8""
как UTF-8 в исходном коде. Имеет значение только то, что исходный код использует одну и ту же кодировку во всем файле и что компилятор знает, какую кодировку ожидать. Например, GCC действительно поддерживает набор символов Windows-1252, его просто нужно указать в командной строке. - person tay10r   schedule 26.02.2017