[ttssh2-commit] [10764] 受信文字コードがUTF-8の時の不正な文字チェックを修正

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 6月 15日 (木) 00:31:34 JST


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\x82΁A
-			// 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\x82΁A
+				// 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 {


ttssh2-commit メーリングリストの案内
Back to archive index