BREW RSS Reader - 7 / 9 -
Handle Japanese Characters
When the character encoding of XML documents is UTF-8, it is necessary to convert UTF-8 characters to Shift_JIS by using KDDI extention functions for displaying characters on mobile phones used in Japan.
In order to use C++ wrappers for KDDI extention functions, SophiaFramework.hpp should be included after TARGET_EXTENSION_KDDI macro is defined.
#ifndef TARGET_EXTENSION_KDDI #define TARGET_EXTENSION_KDDI #endif #include <SophiaFramework.hpp>
Unicode16ToShiftJIS(): Convert Unicode16 to Shift_JIS
SFCError Unicode16ToShiftJIS(SFXWideStringConstRef in, SFXAnsiStringPtr out) { SFCError error; SFBKDDIUnicodeSJISSmp jis; jis = SFBKDDIUnicodeSJIS::NewInstance(); if (jis != null) { // reserve buffer for string to convert error = out->SetLength(in.GetLengthCString() * 2); if (error == SFERR_NO_ERROR) { // convert Unicode16 to Shift_JIS if (jis->Unicode16toSjis(const_cast<WCharPtr>(in.GetBuffer()), out->GetBuffer(), out->GetLength())) { // Following is for handling the bug // that Unicode16toSjis() has // Extra '\0' should be deleted before ASCII characters // added when converting Unicode16 to Shift_JIS // If ASCII characters are included if (in.GetLengthCString()*2 != out->GetLengthCString()) { ACharPtr p1 = out->GetBuffer(); ACharPtr p2 = p1; SIntN i; for (i = 0; i < in.GetLengthCString() * 2; ++i) { if (*p1 != '\0') { *p2 = *p1; ++p2; } ++p1; } *p2 = '\0'; } out->Set(out->Truncate()); } else { error = SFERR_FAILED; // failure } } } else { error = SFERR_FAILED; // failure } return error; }
Utf8toShiftJIS(): Convert UFT-8 to Shift_JIS through UTF-16
SFCError Utf8toShiftJIS(SFXAnsiStringConstRef in, SFXAnsiStringPtr out) { SFXAnsiString sjis; SFXWideString temp, line; SFCError error; SInt32 i, j, start, end, length; error = temp.SetLength(in.GetLengthCString()); if (error == SFERR_NO_ERROR) { temp.Fill('\0'); // convert UTF-8 to UTF-16 if(SFXHelper::utf8towstr(in.GetCString(),in.GetLengthCString(), temp.GetBuffer(), temp.GetLength() * 2)) { temp = temp.Truncate(); error = out->SetLength(temp.GetLengthCString() * 2); if (error == SFERR_NO_ERROR) { i = 0; j = 0; start = 0; length = temp.GetLengthCString(); // convert line by line while (error == SFERR_NO_ERROR && i < length) { while (i < length && temp[i] != '\r' && temp[i] != '\n' && temp[i] != '\t' && temp[i] != 0x301C) { ++i; } end = i; if (start < end) { line = temp.Substring(start, end); error = Unicode16ToShiftJIS(line, &sjis); if (error != SFERR_NO_ERROR) { break; } out->Copy(j, sjis); j += sjis.GetLength(); } if (i < length) { out->SetChar(j, static_cast<AChar>(temp[i])); ++j; ++i; start = i; } } out->SetLength(j); } } else { error = SFERR_FAILED; // failure } } if (error != SFERR_NO_ERROR) { out->Clear(); } return error; }