Revision: 10764 https://osdn.net/projects/ttssh2/scm/svn/commits/10764 Author: zmatsuo Date: 2023-06-15 00:31:33 +0900 (Thu, 15 Jun 2023) Log Message: ----------- 受信文字コードがUTF-8の時の不正な文字チェックを修正 - r10763のチェックが十分ではなかった Modified Paths: -------------- trunk/teraterm/teraterm/charset.c -------------- next part -------------- Modified: trunk/teraterm/teraterm/charset.c =================================================================== --- trunk/teraterm/teraterm/charset.c 2023-06-14 14:24:25 UTC (rev 10763) +++ trunk/teraterm/teraterm/charset.c 2023-06-14 15:31:33 UTC (rev 10764) @@ -536,19 +536,26 @@ } } -static void PutReplacementChr(VttermKanjiWork *w, const BYTE *ptr, size_t len) +static void PutReplacementChr(VttermKanjiWork *w, const BYTE *ptr, size_t len, BOOL fallback) { const char32_t replacement_char = w->replacement_char; int i; for (i = 0; i < len; i++) { BYTE c = *ptr++; - if (c < 0x80) { - // \x95s\x90\xB3\x82\xC8UTF-8\x95\xB6\x8E\x9A\x97\xF1\x82̂Ȃ\xA9\x82\xC90x80\x96\xA2\x96\x9E\x82\xAA\x82\xA0\x82\xEA\x82A - // 1\x95\xB6\x8E\x9A\x82\xCCUTF-8\x95\xB6\x8E\x9A\x82Ƃ\xB5\x82Ă\xBB\x82̂܂ܕ\\x8E\xA6\x82\xB7\x82\xE9 - ParseASCII(c); + if (fallback) { + // fallback ISO8859-1 + PutU32(c); } else { - PutU32(replacement_char); + // fallback\x82\xB5\x82Ȃ\xA2 + if (c < 0x80) { + // \x95s\x90\xB3\x82\xC8UTF-8\x95\xB6\x8E\x9A\x97\xF1\x82̂Ȃ\xA9\x82\xC90x80\x96\xA2\x96\x9E\x82\xAA\x82\xA0\x82\xEA\x82A + // 1\x95\xB6\x8E\x9A\x82\xCCUTF-8\x95\xB6\x8E\x9A\x82Ƃ\xB5\x82Ă\xBB\x82̂܂ܕ\\x8E\xA6\x82\xB7\x82\xE9 + ParseASCII(c); + } + else { + PutU32(replacement_char); + } } } } @@ -572,7 +579,7 @@ } if (b < 0x20) { - PutReplacementChr(w, buf, count); + PutReplacementChr(w, buf, count, ts.FallbackToCP932); count = 0; ParseASCII(b); return TRUE; @@ -601,7 +608,7 @@ ParseASCII(b); return TRUE; } - if ((b & 0x40) == 0x00 || b >= 0xf6 ) { + if ((b & 0x40) == 0x00 || b >= 0xf6) { // UTF-8\x82\xC51byte\x82ɏo\x8C\xBB\x82\xB5\x82Ȃ\xA2\x83R\x81[\x83h\x82̂Ƃ\xAB // 0x40 = 0b1011_1111, 0b10xx_xxxx\x82Ƃ\xA2\x82\xA4bit\x83p\x83^\x81[\x83\x93\x82ɂ͂Ȃ\xE7\x82Ȃ\xA2 // 0xf6 \x88ȏ\xE3\x82̂Ƃ\xAB U+10FFFF\x82\xE6\x82\xE8\x91傫\x82\xAD\x82Ȃ\xE9 @@ -623,7 +630,7 @@ else { // fallback\x82\xB5\x82Ȃ\xA2, \x95s\x90\xB3\x82ȕ\xB6\x8E\x9A\x93\xFC\x97\xCD buf[0] = b; - PutReplacementChr(w, buf, 1); + PutReplacementChr(w, buf, 1, FALSE); } return TRUE; } @@ -644,14 +651,7 @@ } } if (code == 0){ - if (ts.FallbackToCP932) { - // fallback ISO8859-1 - PutU32(buf[0]); - } - else { - buf[1] = b; - PutReplacementChr(w, buf, 1); - } + PutReplacementChr(w, buf, 1, ts.FallbackToCP932); count = 0; goto recheck; } @@ -662,6 +662,13 @@ } } + // 2byte\x88ȍ~\x90\xB3\x8F\xED? + if ((b & 0xc0) != 0x80) { // \x8F\xE3\x88\xCA2bit\x82\xAA 10 \x82\xA9? + PutReplacementChr(w, buf, count, ts.FallbackToCP932); + count = 0; + goto recheck; + } + // 2byte\x96ڈȍ~\x95ۑ\xB6 buf[count++] = b; @@ -682,14 +689,7 @@ } } if (code == 0) { - if (ts.FallbackToCP932) { - // fallback ISO8859-1 - PutU32(buf[0]); - PutU32(buf[1]); - } - else { - PutReplacementChr(w, buf, 2); - } + PutReplacementChr(w, buf, count - 1, ts.FallbackToCP932); count = 0; goto recheck; } else { @@ -717,15 +717,7 @@ } } if (code == 0) { - if (ts.FallbackToCP932) { - // fallback ISO8859-1 - PutU32(buf[0]); - PutU32(buf[1]); - PutU32(buf[2]); - } - else { - PutReplacementChr(w, buf, 3); - } + PutReplacementChr(w, buf, count - 1, ts.FallbackToCP932); count = 0; goto recheck; } else {