UTF-16 문자열 (spidermonkey 19의 JSString에서 가져옴)을 UTF-8 문자열로 변환하려고합니다. 나는 변환 된 문자열이 괜찮다고 생각하지만 몇 가지 이유로 변환 루틴은 모든 유니 코드 (비 ASCII 문자)에 대해 두 개의 추가 바이트를 추가합니다. 나는 내가 틀린 일을하고 있다고 확신한다. 좋은 결과가없는 다른 인코딩을 시도했다. 이것은 내가 지금지고있어 무엇을 : 당신이 볼 수 있듯이UTF-16에서 UTF-8로 변환 할 때의 문제
// UTF-16 string "áéíóúñ aeiou", this is the string being converted
// (you can find "aeiou" after \x20\x00, where \x61\x00 is "a")
\xC3\x00\xA1\x00\xC3\x00\xA9\x00\xC3\x00\xAD\x00\xC3\x00\xB3\x00\xC3\x00\xBA\x00\xC3\x00\xB1\x00\x20\x00\x61\x00\x65\x00\x69\x00\x6F\x00\x75\x00\x6E\x00
// UTF-8 string, test string, taken from:
// const char* cmp = "áéíóúñ aeiou"
// This is the result I'm looking for.
\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba\xc3\xb1 aeiou
// UTF-8 string I'm getting after iconv(utf16, utf8)
\xc3\x83\xc2\xa1\xc3\x83\xc2\xa9\xc3\x83\xc2\xad\xc3\x83\xc2\xb3\xc3\x83\xc2\xba\xc3\x83\xc2\xb1 aeioun
, 모든 비 ASCII 문자 사이에 두 개의 추가 바이트 (\ X83의 \의 XC2)이있다. 왜 그 사람이 누군지 압니까?
이 내 변환 루틴 :
shared_ptr<char> convertToUTF8(char* utf16string, size_t len) {
iconv_t cd = iconv_open("UTF-8", "UTF-16LE");
char* utf8;
size_t utf8len;
utf8len = len;
utf8 = (char *)calloc(utf8len, 1);
shared_ptr<char> outptr(utf8);
size_t converted = iconv(cd, &utf16string, &len, &utf8, &utf8len);
if (converted == (size_t)-1) {
fprintf(stderr, "iconv failed\n");
switch (errno) {
case EILSEQ:
fprintf(stderr, "Invalid multibyte sequence.\n");
break;
case EINVAL:
fprintf(stderr, "Incomplete multibyte sequence.\n");
break;
case E2BIG:
fprintf(stderr, "No more room (iconv).\n");
break;
default:
fprintf(stderr, "Error: %s.\n", strerror(errno));
break;
}
outptr = NULL;
}
iconv_close(cd);
assert(outptr);
return outptr;
}
가 나는 또한 this other question에 솔루션을했지만, 나는 정확히 같은 결과를 얻었다. iconv가 여분의 2 바이트를 추가하는 이유는 무엇입니까? 결과를 수동으로 생성 된 utf-8 문자열과 어떻게 일치시킬 수 있습니까?
편집 :