X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstringcodec%2Fjisx0208.cpp;h=df28a376c10ff9760aafcee0cb84acd294c8fdde;hp=6f07d05aac044065146d5d806a3ee30847309c78;hb=8e1db641bb244980bc96ee9da4ba2f0dee8274ad;hpb=02794ef3620d0d9cc3b8f1c0d8f2995c825fdf4f diff --git a/source/stringcodec/jisx0208.cpp b/source/stringcodec/jisx0208.cpp index 6f07d05..df28a37 100644 --- a/source/stringcodec/jisx0208.cpp +++ b/source/stringcodec/jisx0208.cpp @@ -9,14 +9,16 @@ namespace StringCodec { void JisX0208::Encoder::encode_char(unichar ucs, string &buf) { - unsigned short jis = ucs_to_jisx0208(ucs); + Kuten jis = ucs_to_jisx0208(ucs); if(jis) { - char jbuf[2] = {jis>>8, jis}; + char jbuf[2]; + jbuf[0] = jis.ku+0x20; + jbuf[1] = jis.ten+0x20; buf.append(jbuf, 2); } else - error(ucs, buf, "Can't express character in JIS X 0208"); + error(ucs, buf, invalid_character(ucs, "JIS X 0208")); } void JisX0208::Encoder::transliterate(unichar, string &buf) @@ -28,21 +30,23 @@ void JisX0208::Encoder::transliterate(unichar, string &buf) unichar JisX0208::Decoder::decode_char(const string &str, string::const_iterator &i) { if(i==str.end()) - return error("No input"); + return -1; - string::const_iterator j = i; + auto j = i; Kuten jis; jis.ku = *j++-0x20; unichar result; if(j==str.end()) - result = error("Incomplete JIS X 0208 character"); + result = error(invalid_sequence(i, j, "incomplete JIS X 0208 character")); else { jis.ten = *j++-0x20; result = jisx0208_to_ucs(jis); + if(result==-1) + result = error(invalid_sequence(i, j, "invalid JIS X 0208 ku-ten")); if(result==0) - result = error("Undefined JIS X 0208 character"); + result = error(invalid_sequence(i, j, "undefined JIS X 0208 character")); } i = j; @@ -53,7 +57,7 @@ unichar JisX0208::Decoder::decode_char(const string &str, string::const_iterator unichar jisx0208_to_ucs(Kuten jis) { if(jis.ku==0 || jis.ku>0x5E || jis.ten==0 || jis.ten>0x5E) - return 0; + return -1; return jisx0208_to_ucs_table[jis.ku*94 + jis.ten - 95]; } @@ -75,8 +79,8 @@ Kuten ucs_to_jisx0208(unichar c) Kuten result; if(ucs_to_jisx0208_table[i].ucs==static_cast(c)) { - result.ku = (ucs_to_jisx0208_table[i].jis>>8)+1; - result.ten = ucs_to_jisx0208_table[i].jis+1; + result.ku = (ucs_to_jisx0208_table[i].jis>>8); + result.ten = ucs_to_jisx0208_table[i].jis; } return result;