OSDN Git Service

ファイルの読み込み時に文字コードを適切なものに変換するように修正
authorHabu <habu@users.sourceforge.jp>
Wed, 26 Feb 2014 14:41:05 +0000 (23:41 +0900)
committerHabu <habu@users.sourceforge.jp>
Fri, 28 Feb 2014 12:30:26 +0000 (21:30 +0900)
ファイルを読み込み時に文字コードがUTF-8かどうかを推測し、UTF-8ならば
システムの文字コード(WindowsならCP932、Linux/UNIXならEUC-JP)に
変換して読み込むようにした。

src/externs.h
src/japanese.c
src/util.c

index e45958a..5be477e 100644 (file)
@@ -1763,6 +1763,7 @@ extern void sjis2euc(char *str);
 extern void euc2sjis(char *str);
 extern byte codeconv(char *str);
 extern bool iskanji2(cptr s, int x);
+extern void guess_convert_to_system_encoding(char* strbuf, int buflen);
 #endif
 
 #ifdef WORLD_SCORE
index 49d0a37..832e3ae 100644 (file)
@@ -357,5 +357,92 @@ bool iskanji2(cptr s, int x)
        return FALSE;
 }
 
-#endif /* JP */
+/*!
+ * @brief Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param str È½Äꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @return Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ */
+static bool is_ascii_str(cptr str)
+{
+       for (;*str; str++) {
+               if (!(0x00 < *str && *str <= 0x7f))
+                       return FALSE;
+       }
+       return TRUE;
+}
+
+/*!
+ * @brief Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤«¤É¤¦¤«¤òȽÄꤹ¤ë
+ * @param str È½Äꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @return Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ */
+static bool is_utf8_str(cptr str)
+{
+       const unsigned char* p;
+       for (p = (const unsigned char*)str; *p; p++) {
+               int subseq_num = 0;
+               if (0x00 < *p && *p <= 0x7f) continue;
+               
+               if ((*p & 0xe0) == 0xc0) subseq_num = 1;
+               if ((*p & 0xf0) == 0xe0) subseq_num = 2;
+               if ((*p & 0xf8) == 0xf0) subseq_num = 3;
+
+               if (subseq_num == 0) return FALSE;
+               while (subseq_num--) {
+                       p++;
+                       if (!*p || (*p & 0xc0) != 0x80) return FALSE;
+               }
+       }
+       return TRUE;
+}
+
+/*!
+ * @brief Ê¸»ú¥³¡¼¥É¤¬UTF-8¤Îʸ»úÎó¤ò¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë
+ * @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
+ * @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
+ * @return ¤Ê¤·
+ */
+#ifdef SJIS
+#ifdef WINDOWS
+#include <Windows.h>
+static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
+{
+       LPWSTR utf16buf;
+       int input_str_len = strlen(utf8_str);
+       int len;
+
+       C_MAKE(utf16buf, input_str_len, WCHAR);
+
+       MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8_str, input_str_len, (LPWSTR)utf16buf, input_str_len);
+       len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)utf16buf, -1, (LPSTR)sys_str_buffer, sys_str_buflen, NULL, NULL );
+
+       sys_str_buffer[len] = '\0';
+
+       C_KILL(utf16buf, input_str_len, WCHAR);
+}
+#endif
+#endif
 
+/*!
+ * @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
+ * @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
+ *               ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤­¤µ¤ì¤ë¡£
+ * @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
+ * @return ¤Ê¤·
+ */
+void guess_convert_to_system_encoding(char* strbuf, int buflen)
+{
+       if (is_ascii_str(strbuf)) return;
+
+       if (is_utf8_str(strbuf)) {
+               char* work;
+               C_MAKE(work, buflen, char);
+               strncpy(work, strbuf, buflen);
+               utf8_to_sys(work, strbuf, buflen);
+               C_KILL(work, buflen, char);
+       }
+}
+
+#endif /* JP */
index 5ef7f93..d67359b 100644 (file)
@@ -452,6 +452,7 @@ errr my_fgets(FILE *fff, char *buf, huge n)
        /* Read a line */
        if (fgets(tmp, 1024, fff))
        {
+               guess_convert_to_system_encoding(tmp, sizeof(tmp));
                /* Convert weirdness */
                for (s = tmp; *s; s++)
                {