LINUX.ORG.RU

Unicode encoding


0

1

Всем привет, пытаюсь раскодировать Unicode, с русскими символами разобрался, получаю 0430 (а) и просто прибавля 0xCC80 и все работает, получаю d0b0, но как быть например с символом 다, получаю от wchar_t(ws = L"다") B2E4, но для раскодирования должно быть EB8BA4, в общем я могу конечно так же прибавить какую-то константу, но может есть более правильный способ? кодировка UTF-8

★★★
Ответ на: комментарий от Int64

с 5ти байтовыми и 6ти байтовыми символами

Их в стандарте нет, так что код, отвечающий за декодирование 5/6-байтных последовательностей нужно выкинуть.

Впрочем, в твоей реализации есть еще несколько дырок.

https://tools.ietf.org/html/rfc3629

gatsu
()
Последнее исправление: gatsu (всего исправлений: 1)
Ответ на: комментарий от gatsu

ок убрал, а что еще за дырки? не до 0x1FFFFF а до 0x10FFFF?

Int64 ★★★
() автор топика
Ответ на: комментарий от gatsu

кажется понял, в безопасности дырки

Int64 ★★★
() автор топика
Ответ на: комментарий от gatsu

переписал так:

string EncodeUTF8(wchar_t uc) {
	string ret;
	Uint8 b1, b2, b3, b4, b5, b6;
	
	if (uc == 0x0040) return "";
	
	//
	if ((uc > 0x1 & uc <= 0x007F) == 1) {
		ret += uc;
		//
	} else if ((uc > 0x007F & uc <= 0x07FF) == 1) {
		b1 = 0xC0 | (uc & 0x7C0) >> 6;
		b2 = 0x80 | (uc & 0x3F);
		//
		ret  = b1;
		ret += b2;
		//
	} else if ((uc > 0x07FF & uc <= 0xFFFF) == 1) {
		b1 = 0xE0 | (uc & 0xF000) >> 12;
		b2 = 0x80 | (uc & 0xFC0) >> 6;
		b3 = 0x80 | (uc & 0x3F);
		//
		ret  = b1; ret += b2; ret += b3;
		//
	} else if ((uc > 0xFFFF & uc <= 0x10FFFF) == 1) {
		b1 = 0xF0 | (uc & 0x1C00000) >> 18;
		b2 = 0x80 | (uc & 0x3F000) >> 12;
		b3 = 0x80 | (uc & 0xFC0) >> 6;
		b4 = 0x80 | (uc & 0x3F);
		//
		ret  = b1; ret += b2; ret += b3;
		ret += b4;
		//
	}
	
	return ret;
}

Int64 ★★★
() автор топика
Ответ на: комментарий от Int64

А, ты же преобразуешь Unicode в UTF-8, тут всё элементарно.

Добавь игнорирование суррогатных пар UTF-16 (область 0xD800—0xDFFF).

https://github.com/gatsu/UTF8/blob/master/lib/utf8/base.php#L176

И вот это тебе может быть когда-нибудь пригодится: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt

gatsu
()
Последнее исправление: gatsu (всего исправлений: 1)
Ответ на: комментарий от gatsu

спасибо большое, добавил игнор )

Int64 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.