With such a goal, and especially when the terminal uses ASCII, I thought of selecting a target encoding with the "//TRANSLIT" suffix in the call to iconv_open(), to enable the transliteration of characters with diacritical markas, such as ã, ç and é , к их аналогам ASCII без таких знаков (т.е. a , c и e , соответствующая).
До моего попытки реализовать, я проверил с использованием Iconv , чтобы проверить, что мой подход будет работать, и он проверил Terminm. сеанс). < /p>
Код: Выделить всё
$ echo 'café com açúcar'
café com açúcar
$ echo 'café com açúcar' | iconv -f UTF-8 -t ASCII//TRANSLIT
cafe com acucar
$ echo 'café com açúcar' | iconv -f UTF-8 -t WCHAR_T | iconv -f WCHAR_T -t ASCII//TRANSLIT
cafe com acucar
Я попытался повторить проблему в минимально работающем примере (с некоторым кодом отладки) ниже. < /p>
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const char msg[]="café com açúcar";
char local_msg[1000];
wchar_t wc_msg[1000];
// For debugging
void dump_str(const char *s){ cout loc)
local_charset=p+1;
else
local_charset="ASCII//TRANSLIT";
iconv_t u8_local=iconv_open(local_charset, "UTF-8");
iconv_t u8_wc=iconv_open("WCHAR_T", "UTF-8");
iconv_t wc_local=iconv_open(local_charset, "WCHAR_T");
cout WCHAR_T:
iconv(...)=0; src="café com açúcar"; dst=L"\x63\x61\x66\xe9\x20\x63\x6f\x6d\x20\x61\xe7\xfa\x63\x61\x72"; in_left=0; out_left=3940
WCHAR_T -> ASCII//TRANSLIT:
iconv(...)=3; src=L"\x63\x61\x66\xe9\x20\x63\x6f\x6d\x20\x61\xe7\xfa\x63\x61\x72"; dst="caf? com a??car"; in_left=0; out_left=985
Подробнее здесь: https://stackoverflow.com/questions/797 ... pplication