Toyomasa Watarai
/
locale_test
UTF-8 to SJIS conversion
This example program converts UTF-8 code to Shift-JIS code.
Diff: main.cpp
- Revision:
- 2:43bc6ceb9ae5
- Parent:
- 1:9bd53bc5ff51
--- a/main.cpp Sat Aug 24 15:10:43 2013 +0000 +++ b/main.cpp Sun Aug 25 00:04:41 2013 +0000 @@ -4,11 +4,9 @@ #pragma import __use_all_ctype -DigitalOut myled(LED1); - -static char buf_s[1024]; -static char buf_u[1024] = {0xE6,0x97,0xA5,0xE6,0x9C,0xAC,0xE8,0xAA,0x9E,0xE6,0x96,0x87,0xE5,0xAD,0x97,0xE5,0x88,0x97,0x5F,0x41,0x42,0x43,0x44,0x5F,0x30,0x31,0x32,0x33,0x00}; -static wchar_t wstr[1024]; +char buf_s[256]; +const char buf_u[256] = {0xE6,0x97,0xA5,0xE6,0x9C,0xAC,0xE8,0xAA,0x9E,0xE6,0x96,0x87,0xE5,0xAD,0x97,0xE5,0x88,0x97,0x5F,0x41,0x42,0x43,0x44,0x5F,0x30,0x31,0x32,0x33,0x00}; +wchar_t wstr[256]; static int utf8tosjis(const char* utfBuffer, int utfBufLen, char* sjisBuffer, int sjisBufLen) { @@ -20,28 +18,53 @@ i = wi = 0; current_locale = setlocale(LC_CTYPE, "UTF-8"); - if (current_locale != NULL) { - printf("Current locale is : %s \n", current_locale); - } + if (current_locale == NULL) + return 0; while (1) { ret = mbrtowc(&wc, utfBuffer+i, 3, &state); if (ret == (size_t)-2 || ret == (size_t)-1) { printf("\nThere was a problem decoding the multibyte string.\n"); - return ret; + return ret; } else if (ret == 0) { - break; /* we hit \0, end of string */ + break; /* we hit \0, end of string */ } else { i += ret; wstr[wi++] = wc; } } wstr[wi] = L'\0'; + + current_locale = setlocale(LC_CTYPE, "SJIS"); + if (current_locale == NULL) + return 0; + + ret = wcstombs(sjisBuffer, wstr, sjisBufLen); + return ret; } int main() { - int err = 0; - err = utf8tosjis(buf_u, 29, buf_s, sizeof(buf_s)); + + size_t sz; + + // assuming UTF-8 is NULL terminated + sz = strlen(buf_u); + + printf("\nUTF-8:\n"); + for(int i=0; i<sz; i++) { + printf("0x%02x ", buf_u[i]); + } + + int len = utf8tosjis(buf_u, sz, buf_s, sizeof(buf_s)); + + printf("\nSJIS:\n"); + if (len != -1) { + for(int i=0; i<len; i++) { + printf("0x%02x ", buf_s[i]); + } + printf("\n"); + } + return 0; }