• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision7466 (tree)
Time2019-03-10 02:33:27
Authorzmatsuo

Log Message

新しいMBCPToUTF32()追加、従来の関数は MBCP_UTF32() にリネーム

Change Summary

Incremental Difference

--- trunk/teraterm/common/codeconv.cpp (revision 7465)
+++ trunk/teraterm/common/codeconv.cpp (revision 7466)
@@ -96,7 +96,7 @@
9696 /**
9797 * CP932文字(Shift_JIS) 1文字からUTF-32へ変換する
9898 * @param[in] cp932 CP932文字
99- * @retval 変換したUTF-32文字数
99+ * @retval 変換したUTF-32文字
100100 * 0=エラー(変換できなかった)
101101 */
102102 unsigned int CP932ToUTF32(unsigned short cp932)
@@ -161,30 +161,33 @@
161161
162162 /**
163163 * code page の mulit byte 文字を UTF-32へ変換する
164- * @param KCode マルチバイトの文字コード(0x0000-0xffff)
165- * @param CoePage マルチバイトのコードページ
166- * @retval unicode(UTF-32文字コード)
164+ * @param mb_code マルチバイトの文字コード(0x0000-0xffff)
165+ * @param code_page マルチバイトのコードページ
166+ * @retval unicode(UTF-32文字コード)
167167 */
168-unsigned int MBCPToUTF32(unsigned short KCode, int CodePage)
168+unsigned int MBCP_UTF32(unsigned short mb_code, int code_page)
169169 {
170170 unsigned int c;
171171
172- if (CodePage == 932) {
173- c = CP932ToUTF32(KCode);
172+ if (code_page == CP_ACP) {
173+ code_page = (int)GetACP();
174+ }
175+ if (code_page == 932) {
176+ c = CP932ToUTF32(mb_code);
174177 } else {
175- char buf[3];
178+ char buf[2];
176179 wchar_t wchar;
177180 int ret;
178181 int len = 0;
179- if (KCode < 0x100) {
180- buf[0] = KCode & 0xff;
182+ if (mb_code < 0x100) {
183+ buf[0] = mb_code & 0xff;
181184 len = 1;
182185 } else {
183- buf[0] = KCode >> 8;
184- buf[1] = KCode & 0xff;
186+ buf[0] = mb_code >> 8;
187+ buf[1] = mb_code & 0xff;
185188 len = 2;
186189 }
187- ret = MultiByteToWideChar(CodePage, MB_ERR_INVALID_CHARS, buf, len, &wchar, 1);
190+ ret = MultiByteToWideChar(code_page, MB_ERR_INVALID_CHARS, buf, len, &wchar, 1);
188191 if (ret <= 0) {
189192 c = 0;
190193 } else {
@@ -386,6 +389,51 @@
386389 }
387390
388391 /**
392+ * マルチバイト文字(code_page) からunicode(UTF-32)を1文字取り出す
393+ * @retval 0 文字として扱えない(文字コードがおかしい)
394+ * @retval 1 1キャラクタで1文字として扱える
395+ * @retval 2 2キャラクタで1文字として扱える
396+ */
397+size_t MBCPToUTF32(const char *mb_ptr, size_t mb_len, int code_page, unsigned int *u32)
398+{
399+ size_t input_len;
400+ wchar_t u16_str[2];
401+ size_t u16_len;
402+
403+ assert(mb_ptr != NULL);
404+ if (mb_len == 0) {
405+ *u32 = 0;
406+ return 0;
407+ }
408+ if (code_page == CP_ACP) {
409+ code_page = (int)GetACP();
410+ }
411+
412+ input_len = 1;
413+ while(1) {
414+ u16_len = ::MultiByteToWideChar(code_page, MB_ERR_INVALID_CHARS,
415+ mb_ptr, (int)input_len,
416+ u16_str, 2);
417+ if (u16_len != 0) {
418+ size_t r = UTF16ToUTF32(u16_str, u16_len, u32);
419+ assert(r != 0);
420+ if (r == 0) {
421+ // ないはず
422+ return 0;
423+ } else {
424+ return input_len;
425+ }
426+ }
427+
428+ input_len++;
429+ if (input_len > mb_len) {
430+ *u32 = 0;
431+ return 0;
432+ }
433+ }
434+}
435+
436+/**
389437 * UTF-32文字 から UTF-8 へ変換する
390438 * @param[in] u32 変換するUTF-32
391439 * @param[in,out] u8_ptr 変換後UTF-8文字列出力先(NULLのとき出力しない)
@@ -397,7 +445,7 @@
397445 {
398446 size_t out_len = 0;
399447 uint8_t *u8_ptr = (uint8_t *)u8_ptr_;
400- if (u8_ptr != NULL) {
448+ if (u8_ptr == NULL) {
401449 u8_len = 4;
402450 }
403451
--- trunk/teraterm/common/codeconv.h (revision 7465)
+++ trunk/teraterm/common/codeconv.h (revision 7466)
@@ -34,16 +34,17 @@
3434 extern "C" {
3535 #endif
3636
37-
3837 // simple code convert
3938 unsigned int CP932ToUTF32(unsigned short cp932);
4039 unsigned short UTF32ToDecSp(unsigned int u32);
41-unsigned int MBCPToUTF32(unsigned short KCode, int CodePage);
40+unsigned int MBCP_UTF32(unsigned short mb_code, int code_page);
4241 unsigned short UTF32_CP932(unsigned int u32);
4342
4443 // 1char ToUTF32
4544 size_t UTF8ToUTF32(const char *u8_ptr_, size_t u8_len, unsigned int *u32_);
4645 size_t UTF16ToUTF32(const wchar_t *wstr_ptr, size_t wstr_len, unsigned int *u32);
46+size_t MBCPToUTF32(const char *mb_ptr, size_t mb_len, int code_page, unsigned int *u32);
47+
4748 // 1char UTF32To
4849 size_t UTF32ToUTF16(unsigned int u32, wchar_t *wstr_ptr, size_t wstr_len);
4950 size_t UTF32ToUTF8(unsigned int u32, char *u8_ptr, size_t u8_len);
--- trunk/teraterm/ttpcmn/ttcmn.c (revision 7465)
+++ trunk/teraterm/ttpcmn/ttcmn.c (revision 7466)
@@ -1589,7 +1589,7 @@
15891589 unsigned int code;
15901590 int outlen;
15911591
1592- code = MBCPToUTF32(K, CodePage);
1592+ code = MBCP_UTF32(K, CodePage);
15931593 if (code == 0) {
15941594 // 変換失敗
15951595 code = 0xfffd; // U+FFFD: Replacement Character
Show on old repository browser