Đây là một phiên bản của câu trả lời filmor rằng tôi đã viết cho mục đích của tôi. Có thể đọc được một chút, có thể chậm hơn một chút. Tôi không cần các công cụ mẫu vì tôi luôn giao dịch với char *
và trong trường hợp của tôi, tôi muốn thay thế ký tự không phải của Latin1 bằng _. Chỉ trong trường hợp nó giúp ai đó:
int GetUtf8CharacterLength(unsigned char utf8Char)
{
if (utf8Char < 0x80) return 1;
else if ((utf8Char & 0x20) == 0) return 2;
else if ((utf8Char & 0x10) == 0) return 3;
else if ((utf8Char & 0x08) == 0) return 4;
else if ((utf8Char & 0x04) == 0) return 5;
return 6;
}
char Utf8ToLatin1Character(char *s, int *readIndex)
{
int len = GetUtf8CharacterLength(static_cast<unsigned char>(s[ *readIndex ]));
if (len == 1)
{
char c = s[ *readIndex ];
(*readIndex)++;
return c;
}
unsigned int v = (s[ *readIndex ] & (0xff >> (len + 1))) << ((len - 1) * 6);
(*readIndex)++;
for (len-- ; len > 0 ; len--)
{
v |= (static_cast<unsigned char>(s[ *readIndex ]) - 0x80) << ((len - 1) * 6);
(*readIndex)++;
}
return (v > 0xff) ? 0 : (char)v;
}
// overwrites s in place
char *Utf8ToLatin1String(char *s)
{
for (int readIndex = 0, writeIndex = 0 ; ; writeIndex++)
{
if (s[ readIndex ] == 0)
{
s[ writeIndex ] = 0;
break;
}
char c = Utf8ToLatin1Character(s, &readIndex);
if (c == 0)
{
c = '_';
}
s[ writeIndex ] = c;
}
return s;
}
mã kiểm tra:
char s2[ 256 ] = "lif\xc3\xa9 is b\xc3\xa9tt\xc3\xa9r with acc\xc3\xa9nts";
Utf8ToLatin1String(s2);
Nguồn
2013-11-23 04:16:31
UTF8 thể đại diện cho 65.536 điểm mã; latin1 (ISO-8859-1) chỉ có thể đại diện cho 256. Bạn muốn xử lý tất cả các ký tự không thể chuyển đổi như thế nào? – simonc
Bạn có thể dịch sang C này http://www.jamesmurty.com/2011/12/30/python-code-utf8-to-latin1/ (lưu ý rằng không phải tất cả các ký hiệu đều có thể được chuyển đổi) –
@DavidRF condition "mà không sử dụng bất kỳ libs bổ sung nào "có nghĩa là không sử dụng các hàm sẵn sàng như trong dòng cuối cùng của mã đã cho,' utf8_text.encode ('ISO-8859-1', 'thay thế') ' – Dialecticus