LINUX.ORG.RU

сравнение wchar_t символов


0

0

пишу кодировщик для мтк2/мтк5
для однобайтовой кодировки (koi8-r) все довольно просто
unsigned codir_char_toMtk5(const char &x)
{
switch(x)
{
case 'A':return(SI_2BYTE|65); case 'B':return(SI_2BYTE|66); case 'C':return(SI_2BYTE|67);
case 'D':return(SI_2BYTE|68); case 'E':return(SI_2BYTE|69); case 'F':return(SI_2BYTE|70);
...
case 'Д':return(SO_2BYTE|100); case 'Е':return(SO_2BYTE|101); case 'Ф':return(SO_2BYTE|102);
case 'Г':return(SO_2BYTE|103); case 'Х':return(SO_2BYTE|104); case 'И':return(SO_2BYTE|105);
...
}
}
и обратно
char decodir_fromMtk5(const char &x,const char &reg)
{
switch(reg)
{
case(REG_MTK5_LAT): switch(x)//при REG_MTK5_LAT (латынь)
{
case 65:return 'A'; case 66:return 'B'; case 67:return 'C';
...
}
case(REG_MTK5_RUS): switch(x)//при REG_MTK5_RUS (кирилица)
{
case 64:return 'ю'; case 65:return 'а'; case 66:return 'б';
case 67:return 'ц'; case 68:return 'д'; case 69:return 'е';
...
}
}
а вот как сделать для utf8?
wchar_t в switch не засунешь, да и
wchar_t x;
if(x=='б')return 66;
не прокатывает.
Подскажите пожалуйста как сравнивать wchar_t?


во-первых, utf8 != wchar_t (по сути, wchar_t это либо utf16, либо utf32). во-вторых, сравнивать очень даже можно: if (x == u'Y') { … } else if (x == 0x0414) { … } и т.п.

arsi ★★★★★
()

> case 'Д':

не пишите так - отроете/сохраните в каком-нибудь не очень догадливом редакторе, или будете собирать другим компилятором - и получите проблемы на ровном месте

wchar_t в switch не засунешь


почему? легко

Подскажите пожалуйста как сравнивать wchar_t?


с чем сравнивать?

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

не пишите так - отроете/сохраните в каком-нибудь не очень догадливом редакторе, или будете собирать другим компилятором - и получите проблемы на ровном месте

я только переползаю (медленно и печально) на юникод, раньше такой проблемы не стояло.
как писать можно пример.

wchar_t в switch не засунешь

почему? легко

а можно пример

с чем сравнивать?

wchar_t x;
if(x=='б')return 66;
я так понимаю это не совсем корректный код

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

> как писать можно пример.

просто код символа

я так понимаю это не совсем корректный код


надо просто один символ менять на другой? если да - почитайте про std::map

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

да действительно std::map хороший вариант, спасибо.
и еще уточните пожалуйста

wchar_t x;

if(x=='б')return 66;


if (x == 0x0431) return 66;

почему 0x0431 а не 0xD0B1

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

> почему 0x0431 а не 0xD0B1

потому, что

> utf8 != wchar_t (по сути, wchar_t это либо utf16, либо utf32)

«б»:

UTF-8: 0xD0 0xB1

UTF-16: 0x0431

UTF-32: 0x00000431

также рекомендуется к прочтению: http://ru.wikipedia.org/wiki/UTF-8

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