OSDN Git Service

[Refactor] #37353 型の置換(C_MAKE)。 / Type replacement(C_MAKE).
[hengband/hengband.git] / src / japanese.c
index 9e604ee..4e0c0b1 100644 (file)
@@ -1,5 +1,8 @@
-/* File: japanese.c */
-
+/*!
+ *  @file japanese.c
+ *  @brief 日本語処理関数
+ *  @date 2014/07/07
+ */
 
 #include "angband.h"
 
@@ -9,64 +12,70 @@ typedef struct convert_key convert_key;
 
 struct convert_key
 {
-       cptr key1;
-       cptr key2;
+       concptr key1;
+       concptr key2;
 };
 
 static const convert_key s2j_table[] = {
        {"mb","nb"}, {"mp","np"}, {"mv","nv"}, {"mm","nm"},
        {"x","ks"},
-       /* sindar:¥·¥ó¥À¡¼¥ë  parantir:¥Ñ¥é¥ó¥Æ¥£¥¢  feanor:¥Õ¥§¥¢¥Î¡¼¥ë */
+       /* sindar:シンダール  parantir:パランティア  feanor:フェアノール */
        {"ar$","a-ru$"}, {"ir$","ia$"}, {"or$","o-ru$"},
-       {"ra","¥é"}, {"ri","¥ê"}, {"ru","¥ë"}, {"re","¥ì"}, {"ro","¥í"},
-       {"ir","ia"}, {"ur","ua"}, {"er","ea"}, {"ar","a¥ë"},
-       {"sha","¥·¥ã"}, {"shi","¥·"}, {"shu","¥·¥å"}, {"she","¥·¥§"}, {"sho","¥·¥ç"},
-       {"tha","¥µ"}, {"thi","¥·"}, {"thu","¥¹"}, {"the","¥»"}, {"tho","¥½"},
-       {"cha","¥Ï"}, {"chi","¥Ò"}, {"chu","¥Õ"}, {"che","¥Ø"}, {"cho","¥Û"},
-       {"dha","¥¶"}, {"dhi","¥¸"}, {"dhu","¥º"}, {"dhe","¥¼"}, {"dho","¥¾"},
-       {"ba","¥Ð"}, {"bi","¥Ó"}, {"bu","¥Ö"}, {"be","¥Ù"}, {"bo","¥Ü"},
-       {"ca","¥«"}, {"ci","¥­"}, {"cu","¥¯"}, {"ce","¥±"}, {"co","¥³"},
-       {"da","¥À"}, {"di","¥Ç¥£"}, {"du","¥É¥¥"}, {"de","¥Ç"}, {"do","¥É"},
-       {"fa","¥Õ¥¡"}, {"fi","¥Õ¥£"}, {"fu","¥Õ"}, {"fe","¥Õ¥§"}, {"fo","¥Õ¥©"},
-       {"ga","¥¬"}, {"gi","¥®"}, {"gu","¥°"}, {"ge","¥²"}, {"go","¥´"},
-       {"ha","¥Ï"}, {"hi","¥Ò"}, {"hu","¥Õ"}, {"he","¥Ø"}, {"ho","¥Û"},
-       {"ja","¥¸¥ã"}, {"ji","¥¸"}, {"ju","¥¸¥å"}, {"je","¥¸¥§"}, {"jo","¥¸¥ç"},
-       {"ka","¥«"}, {"ki","¥­"}, {"ku","¥¯"}, {"ke","¥±"}, {"ko","¥³"},
-       {"la","¥é"}, {"li","¥ê"}, {"lu","¥ë"}, {"le","¥ì"}, {"lo","¥í"},
-       {"ma","¥Þ"}, {"mi","¥ß"}, {"mu","¥à"}, {"me","¥á"}, {"mo","¥â"},
-       {"na","¥Ê"}, {"ni","¥Ë"}, {"nu","¥Ì"}, {"ne","¥Í"}, {"no","¥Î"},
-       {"pa","¥Ñ"}, {"pi","¥Ô"}, {"pu","¥×"}, {"pe","¥Ú"}, {"po","¥Ý"},
-       {"qu","¥¯"},
-       {"sa","¥µ"}, {"si","¥·"}, {"su","¥¹"}, {"se","¥»"}, {"so","¥½"},
-       {"ta","¥¿"}, {"ti","¥Æ¥£"}, {"tu","¥È¥¥"}, {"te","¥Æ"}, {"to","¥È"},
-       {"va","¥ô¥¡"}, {"vi","¥ô¥£"}, {"vu","¥ô"}, {"ve","¥ô¥§"}, {"vo","¥ô¥©"},
-       {"wa","¥ï"}, {"wi","¥¦¥£"}, {"wu","¥¦"}, {"we","¥¦¥§"}, {"wo","¥¦¥©"},
-       {"ya","¥ä"}, {"yu","¥æ"}, {"yo","¥è"},
-       {"za","¥¶"}, {"zi","¥¸"}, {"zu","¥º"}, {"ze","¥¼"}, {"zo","¥¾"},
-       {"dh","¥º"}, {"ch","¥Õ"}, {"th","¥¹"},
-       {"b","¥Ö"}, {"c","¥¯"}, {"d","¥É"}, {"f","¥Õ"}, {"g","¥°"},
-       {"h","¥Õ"}, {"j","¥¸¥å"}, {"k","¥¯"}, {"l","¥ë"}, {"m","¥à"},
-       {"n","¥ó"}, {"p","¥×"}, {"q","¥¯"}, {"r","¥ë"}, {"s","¥¹"},
-       {"t","¥È"}, {"v","¥ô"}, {"w","¥¦"}, {"y","¥¤"},
-       {"a","¥¢"}, {"i","¥¤"}, {"u","¥¦"}, {"e","¥¨"}, {"o","¥ª"},
-       {"-","¡¼"},
+       {"ra","ラ"}, {"ri","リ"}, {"ru","ル"}, {"re","レ"}, {"ro","ロ"},
+       {"ir","ia"}, {"ur","ua"}, {"er","ea"}, {"ar","a"},
+       {"sha","シャ"}, {"shi","シ"}, {"shu","シュ"}, {"she","シェ"}, {"sho","ショ"},
+       {"tha","ã\82µ"}, {"thi","ã\82·"}, {"thu","ã\82¹"}, {"the","ã\82»"}, {"tho","ã\82½"},
+       {"cha","ハ"}, {"chi","ヒ"}, {"chu","フ"}, {"che","ヘ"}, {"cho","ホ"},
+       {"dha","ã\82¶"}, {"dhi","ã\82¸"}, {"dhu","ã\82º"}, {"dhe","ã\82¼"}, {"dho","ã\82¾"},
+       {"ba","バ"}, {"bi","ビ"}, {"bu","ブ"}, {"be","ベ"}, {"bo","ボ"},
+       {"ca","ã\82«"}, {"ci","ã\82­"}, {"cu","ã\82¯"}, {"ce","ã\82±"}, {"co","ã\82³"},
+       {"da","ダ"}, {"di","ディ"}, {"du","ドゥ"}, {"de","デ"}, {"do","ド"},
+       {"fa","ã\83\95ã\82¡"}, {"fi","ã\83\95ã\82£"}, {"fu","ã\83\95"}, {"fe","ã\83\95ã\82§"}, {"fo","ã\83\95ã\82©"},
+       {"ga","ã\82¬"}, {"gi","ã\82®"}, {"gu","ã\82°"}, {"ge","ã\82²"}, {"go","ã\82´"},
+       {"ha","ハ"}, {"hi","ヒ"}, {"hu","フ"}, {"he","ヘ"}, {"ho","ホ"},
+       {"ja","ジャ"}, {"ji","ジ"}, {"ju","ジュ"}, {"je","ジェ"}, {"jo","ジョ"},
+       {"ka","ã\82«"}, {"ki","ã\82­"}, {"ku","ã\82¯"}, {"ke","ã\82±"}, {"ko","ã\82³"},
+       {"la","ラ"}, {"li","リ"}, {"lu","ル"}, {"le","レ"}, {"lo","ロ"},
+       {"ma","マ"}, {"mi","ミ"}, {"mu","ム"}, {"me","メ"}, {"mo","モ"},
+       {"na","ナ"}, {"ni","ニ"}, {"nu","ヌ"}, {"ne","ネ"}, {"no","ノ"},
+       {"pa","パ"}, {"pi","ピ"}, {"pu","プ"}, {"pe","ペ"}, {"po","ポ"},
+       {"qu","ã\82¯"},
+       {"sa","ã\82µ"}, {"si","ã\82·"}, {"su","ã\82¹"}, {"se","ã\82»"}, {"so","ã\82½"},
+       {"ta","タ"}, {"ti","ティ"}, {"tu","トゥ"}, {"te","テ"}, {"to","ト"},
+       {"va","ã\83´ã\82¡"}, {"vi","ã\83´ã\82£"}, {"vu","ã\83´"}, {"ve","ã\83´ã\82§"}, {"vo","ã\83´ã\82©"},
+       {"wa","ã\83¯"}, {"wi","ã\82¦ã\82£"}, {"wu","ã\82¦"}, {"we","ã\82¦ã\82§"}, {"wo","ã\82¦ã\82©"},
+       {"ya","ヤ"}, {"yu","ユ"}, {"yo","ヨ"},
+       {"za","ã\82¶"}, {"zi","ã\82¸"}, {"zu","ã\82º"}, {"ze","ã\82¼"}, {"zo","ã\82¾"},
+       {"dh","ã\82º"}, {"ch","ã\83\95"}, {"th","ã\82¹"},
+       {"b","ã\83\96"}, {"c","ã\82¯"}, {"d","ã\83\89"}, {"f","ã\83\95"}, {"g","ã\82°"},
+       {"h","フ"}, {"j","ジュ"}, {"k","ク"}, {"l","ル"}, {"m","ム"},
+       {"n","ã\83³"}, {"p","ã\83\97"}, {"q","ã\82¯"}, {"r","ã\83«"}, {"s","ã\82¹"},
+       {"t","ã\83\88"}, {"v","ã\83´"}, {"w","ã\82¦"}, {"y","ã\82¤"},
+       {"a","ã\82¢"}, {"i","ã\82¤"}, {"u","ã\82¦"}, {"e","ã\82¨"}, {"o","ã\82ª"},
+       {"-","ã\83¼"},
        {NULL,NULL}
 };
 
-/* ¥·¥ó¥À¥ê¥ó¤òÆüËܸì¤ÎÆɤߤËÊÑ´¹¤¹¤ë */
-void sindarin_to_kana(char *kana, const char *sindarin)
+/*!
+ * @brief シンダリンを日本語の読みに変換する
+ * @param kana 変換後の日本語文字列ポインタ
+ * @param sindarin 変換前のシンダリン文字列ポインタ
+ * @return なし
+ * @details
+ */
+void sindarin_to_kana(char *kana, concptr sindarin)
 {
        char buf[256];
        int idx;
 
        sprintf(kana, "%s$", sindarin);
        for (idx = 0; kana[idx]; idx++)
-               if (isupper(kana[idx])) kana[idx] = tolower(kana[idx]);
+               if (isupper(kana[idx])) kana[idx] = (char)tolower(kana[idx]);
 
        for (idx = 0; s2j_table[idx].key1 != NULL; idx++)
        {
-               cptr pat1 = s2j_table[idx].key1;
-               cptr pat2 = s2j_table[idx].key2;
+               concptr pat1 = s2j_table[idx].key1;
+               concptr pat2 = s2j_table[idx].key2;
                int len = strlen(pat1);
                char *src = kana;
                char *dest = buf;
@@ -105,47 +114,54 @@ void sindarin_to_kana(char *kana, const char *sindarin)
 }
 
 
-/*ÆüËܸìÆ°»ì³èÍÑ (ÂǤġäÂǤäÆ,ÂǤÁ etc) */
-/* JVERB_AND: ²¥¤ë,½³¤ë > ²¥¤ê,½³¤ë */
-/* JVERB_TO:  ²¥¤ë,½³¤ë > ²¥¤Ã¤Æ½³¤ë */
-/* JVERB_OR:  ²¥¤ë,½³¤ë > ²¥¤Ã¤¿¤ê½³¤Ã¤¿¤ê */
-
+/*! 日本語動詞活用 (打つ>打って,打ち etc)
+ * JVERB_AND: 殴る,蹴る > 殴り,蹴る
+ * JVERB_TO:  殴る,蹴る > 殴って蹴る
+ * JVERB_OR:  殴る,蹴る > 殴ったり蹴ったり */
 static const struct jverb_table_t {
        const char* from;
        const char* to[3];
 } jverb_table[] = {
-       { "¤¹¤ë", {"¤·", "¤·¤Æ", "¤·¤¿"}},
-       { "¤¤¤ë", {"¤¤¤Æ", "¤¤¤Æ", "¤¤¤¿"}},
-
-       { "¤¨¤ë", {"¤¨", "¤¨¤Æ", "¤¨¤¿"}},
-       { "¤±¤ë", {"¤±", "¤±¤Æ", "¤±¤¿"}},
-       { "¤²¤ë", {"¤²", "¤¨¤Æ", "¤²¤¿"}},
-       { "¤»¤ë", {"¤»", "¤»¤Æ", "¤»¤¿"}},
-       { "¤¼¤ë", {"¤¼", "¤¼¤Æ", "¤¼¤¿"}},
-       { "¤Æ¤ë", {"¤Æ", "¤Æ¤Ã¤Æ", "¤Æ¤Ã¤¿"}},
-       { "¤Ç¤ë", {"¤Ç", "¤Ç¤Æ", "¤Ç¤¿"}},
-       { "¤Í¤ë", {"¤Í", "¤Í¤Æ", "¤Í¤¿"}},
-       { "¤Ø¤ë", {"¤Ø", "¤Ø¤Æ", "¤Ø¤¿"}},
-       { "¤Ù¤ë", {"¤Ù", "¤Ù¤Æ", "¤Ù¤¿"}},
-       { "¤á¤ë", {"¤á", "¤á¤Æ", "¤á¤¿"}},
-       { "¤ì¤ë", {"¤ì", "¤ì¤Æ", "¤ì¤¿"}},
-
-       { "¤¦", {"¤¤", "¤Ã¤Æ", "¤Ã¤¿"}},
-       { "¤¯", {"¤­", "¤¤¤Æ", "¤¤¤¿"}},
-       { "¤°", {"¤®", "¤¤¤Ç", "¤¤¤À"}},
-       { "¤¹", {"¤·", "¤·¤Æ", "¤·¤¿"}},
-       { "¤º", {"¤¸", "¤¸¤Æ", "¤¸¤¿"}},
-       { "¤Ä", {"¤Á", "¤Ã¤Æ", "¤Ã¤¿"}},
-       { "¤Å", {"¤Â", "¤Ã¤Æ", "¤Ã¤¿"}},
-       { "¤Ì", {"¤Ë", "¤Í¤Æ", "¤Í¤¿"}},
-       { "¤Õ", {"¤Ò", "¤Ø¤Æ", "¤Ø¤¿"}},
-       { "¤Ö", {"¤Ó", "¤ó¤Ç", "¤ó¤À"}},
-       { "¤à", {"¤ß", "¤ó¤Ç", "¤ó¤À"}},
-       { "¤ë", {"¤ê", "¤Ã¤Æ", "¤Ã¤¿"}},
-       { NULL, {"¤½¤·¤Æ", "¤³¤È¤Ë¤è¤ê", "¤³¤È¤ä"}},
+       { "する", {"し", "して", "した"}},
+       { "いる", {"いて", "いて", "いた"}},
+
+       { "える", {"え", "えて", "えた"}},
+       { "ける", {"け", "けて", "けた"}},
+       { "げる", {"げ", "えて", "げた"}},
+       { "せる", {"せ", "せて", "せた"}},
+       { "ぜる", {"ぜ", "ぜて", "ぜた"}},
+       { "てる", {"て", "てって", "てった"}},
+       { "でる", {"で", "でて", "でた"}},
+       { "ねる", {"ね", "ねて", "ねた"}},
+       { "へる", {"へ", "へて", "へた"}},
+       { "べる", {"べ", "べて", "べた"}},
+       { "める", {"め", "めて", "めた"}},
+       { "れる", {"れ", "れて", "れた"}},
+
+       { "う", {"い", "って", "った"}},
+       { "く", {"き", "いて", "いた"}},
+       { "ぐ", {"ぎ", "いで", "いだ"}},
+       { "す", {"し", "して", "した"}},
+       { "ず", {"じ", "じて", "じた"}},
+       { "つ", {"ち", "って", "った"}},
+       { "づ", {"ぢ", "って", "った"}},
+       { "ぬ", {"に", "ねて", "ねた"}},
+       { "ふ", {"ひ", "へて", "へた"}},
+       { "ぶ", {"び", "んで", "んだ"}},
+       { "む", {"み", "んで", "んだ"}},
+       { "る", {"り", "って", "った"}},
+       { NULL, {"そして", "ことにより", "ことや"}},
 };
 
-void jverb(const char *in , char *out , int flag)
+/*!
+ * @brief jverb_table_tに従って動詞を活用する
+ * @param in 変換元文字列ポインタ
+ * @param out 変換先文字列ポインタ
+ * @param flag 変換種類を指定(JVERB_AND/JVERB_TO/JVERB_OR)
+ * @return なし
+ * @details
+ */
+void jverb(concptr in, char *out, int flag)
 {
        const struct jverb_table_t * p;
        int in_len = strlen(in);
@@ -164,9 +180,11 @@ void jverb(const char *in , char *out , int flag)
                strcpy(&out[in_len], p->to[flag - 1]);
 }
 
-
-/*
- * Convert SJIS string to EUC string
+/*!
+ * @brief 文字コードをSJISからEUCに変換する / Convert SJIS string to EUC string
+ * @param str 変換する文字列のポインタ
+ * @return なし
+ * @details
  */
 void sjis2euc(char *str)
 {
@@ -208,8 +226,11 @@ void sjis2euc(char *str)
 }  
 
 
-/*
- * Convert EUC string to SJIS string
+/*!
+ * @brief 文字コードをEUCからSJISに変換する / Convert EUC string to SJIS string
+ * @param str 変換する文字列のポインタ
+ * @return なし
+ * @details
  */
 void euc2sjis(char *str)
 {
@@ -252,14 +273,14 @@ void euc2sjis(char *str)
 }  
 
 
-/*
- * str¤ò´Ä¶­¤Ë¹ç¤Ã¤¿Ê¸»ú¥³¡¼¥É¤ËÊÑ´¹¤·¡¢ÊÑ´¹Á°¤Îʸ»ú¥³¡¼¥É¤òÊÖ¤¹¡£
- * str¤ÎŤµ¤ËÀ©¸Â¤Ï¤Ê¤¤¡£
- *
- * 0: Unknown
- * 1: ASCII (Never known to be ASCII in this function.)
- * 2: EUC
- * 3: SJIS
+/*!
+ * @brief strを環境に合った文字コードに変換し、変換前の文字コードを返す。strの長さに制限はない。
+ * @param str 変換する文字列のポインタ
+ * @return 
+ * 0: Unknown<br>
+ * 1: ASCII (Never known to be ASCII in this function.)<br>
+ * 2: EUC<br>
+ * 3: SJIS<br>
  */
 byte codeconv(char *str)
 {
@@ -343,8 +364,13 @@ byte codeconv(char *str)
        return code;
 }
 
-/* Ê¸»úÎós¤Îx¥Ð¥¤¥ÈÌܤ¬´Á»ú¤Î1¥Ð¥¤¥ÈÌܤ«¤É¤¦¤«È½Äꤹ¤ë */
-bool iskanji2(cptr s, int x)
+/*!
+ * @brief 文字列sのxバイト目が漢字の1バイト目かどうか判定する
+ * @param s 判定する文字列のポインタ
+ * @param x 判定する位置(バイト)
+ * @return 漢字の1バイト目ならばTRUE
+ */
+bool iskanji2(concptr s, int x)
 {
        int i;
 
@@ -358,11 +384,11 @@ bool iskanji2(cptr s, int x)
 }
 
 /*!
- * @brief Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤«¤É¤¦¤«¤òȽÄꤹ¤ë
- * @param str È½Äꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
- * @return Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬ASCII¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ * @brief 文字列の文字コードがASCIIかどうかを判定する
+ * @param str å\88¤å®\9aã\81\99ã\82\8bæ\96\87å­\97å\88\97ã\81¸ã\81®ã\83\9dã\82¤ã\83³ã\82¿
+ * @return 文字列の文字コードがASCIIならTRUE、そうでなければFALSE
  */
-static bool is_ascii_str(cptr str)
+static bool is_ascii_str(concptr str)
 {
        for (;*str; str++) {
                if (!(0x00 < *str && *str <= 0x7f))
@@ -372,11 +398,11 @@ static bool is_ascii_str(cptr str)
 }
 
 /*!
- * @brief Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤«¤É¤¦¤«¤òȽÄꤹ¤ë
- * @param str È½Äꤹ¤ëʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
- * @return Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤¬UTF-8¤Ê¤éTRUE¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤ÐFALSE
+ * @brief 文字列の文字コードがUTF-8かどうかを判定する
+ * @param str å\88¤å®\9aã\81\99ã\82\8bæ\96\87å­\97å\88\97ã\81¸ã\81®ã\83\9dã\82¤ã\83³ã\82¿
+ * @return 文字列の文字コードがUTF-8ならTRUE、そうでなければFALSE
  */
-static bool is_utf8_str(cptr str)
+static bool is_utf8_str(concptr str)
 {
        const unsigned char* p;
        for (p = (const unsigned char*)str; *p; p++) {
@@ -396,18 +422,72 @@ static bool is_utf8_str(cptr str)
        return TRUE;
 }
 
+#if defined(EUC)
+#include <iconv.h>
+
+static const struct ms_to_jis_unicode_conv_t {
+       char from[3];
+       char to[3];
+} ms_to_jis_unicode_conv[] = {
+       {{0xef, 0xbd, 0x9e}, {0xe3, 0x80, 0x9c}}, /* FULLWIDTH TILDE -> WAVE DASH */
+       {{0xef, 0xbc, 0x8d}, {0xe2, 0x88, 0x92}}, /* FULLWIDTH HYPHEN-MINUS -> MINUS SIGN */
+};
+
 /*!
- * @brief Ê¸»ú¥³¡¼¥É¤¬UTF-8¤Îʸ»úÎó¤ò¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë
- * @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
- * @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
- * @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
- * @return ÊÑ´¹¤ËÀ®¸ù¤·¤¿¾ì¹çTRUE¡¢¼ºÇÔ¤·¤¿¾ì¹çFALSE¤òÊÖ¤¹
+ * @brief EUCがシステムコードである環境下向けにUTF-8から変換処理を行うサブルーチン
+ * @param str 変換する文字列のポインタ
+ * @return なし
  */
-#ifdef SJIS
-#ifdef WINDOWS
+static void ms_to_jis_unicode(char* str)
+{
+       unsigned char* p;
+       for (p = (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) {
+                       int i;
+                       for (i = 0; i < sizeof(ms_to_jis_unicode_conv) / sizeof(ms_to_jis_unicode_conv[0]); ++ i) {
+                               const struct ms_to_jis_unicode_conv_t *c = &ms_to_jis_unicode_conv[i];
+                               if (memcmp(p, c->from, 3) == 0) {
+                                       memcpy(p, c->to, 3);
+                               }
+                       }
+                       subseq_num = 2;
+                }
+               if ((*p & 0xf8) == 0xf0) subseq_num = 3;
+
+               p += subseq_num;
+       }
+}
+
+#elif defined(SJIS) && defined(WINDOWS)
 #include <Windows.h>
-static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
+#endif
+/*!
+ * @brief 文字コードがUTF-8の文字列をシステムの文字コードに変換する
+ * @param utf8_str 変換するUTF-8の文字列へのポインタ
+ * @param sys_str_buffer 変換したシステムの文字コードの文字列を格納するバッファへのポインタ
+ * @param sys_str_buflen 変換したシステムの文字コードの文字列を格納するバッファの長さ
+ * @return 変換に成功した場合TRUE、失敗した場合FALSEを返す
+ */
+static bool utf8_to_sys(char* utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
 {
+#if defined(EUC)
+
+       iconv_t cd = iconv_open("EUC-JP", "UTF-8");
+       size_t utf8_len = strlen(utf8_str) + 1; /* include termination character */
+       char *from = utf8_str;
+       int ret;
+
+       ms_to_jis_unicode(utf8_str);
+       ret = iconv(cd, &from, &utf8_len, &sys_str_buffer, &sys_str_buflen);
+       iconv_close(cd);
+       return (ret >= 0);
+
+#elif defined(SJIS) && defined(WINDOWS)
+
        LPWSTR utf16buf;
        int input_len = strlen(utf8_str) + 1; /* include termination character */
 
@@ -416,9 +496,9 @@ static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_bufl
        /* UTF-8 -> UTF-16 */
        if (MultiByteToWideChar( CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
                C_KILL(utf16buf, input_len, WCHAR);
-               return FALSE;   
+               return FALSE;
        }
+
        /* UTF-8 -> SJIS(CP932) */
        if (WideCharToMultiByte( CP_ACP, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, NULL, NULL ) == 0) {
                C_KILL(utf16buf, input_len, WCHAR);
@@ -427,17 +507,17 @@ static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_bufl
 
        C_KILL(utf16buf, input_len, WCHAR);
        return TRUE;
-}
-#endif
+
 #endif
+}
 
 /*!
- * @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
- * @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
- *               ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤­¤µ¤ì¤ë¡£
- *               UTF-8¤«¤éSJIS¤â¤·¤¯¤ÏEUC¤Ø¤ÎÊÑ´¹¤òÁÛÄꤷ¤Æ¤¤¤ë¤Î¤Ç¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤¬Â­¤ê¤Ê¤¯¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¡£
- * @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
- * @return ¤Ê¤·
+ * @brief 受け取った文字列の文字コードを推定し、システムの文字コードへ変換する
+ * @param strbuf 変換する文字列を格納したバッファへのポインタ。
+ *               バッファは変換した文字列で上書きされる。
+ *               UTF-8からSJISもしくはEUCへの変換を想定しているのでバッファの長さが足りなくなることはない。
+ * @param buflen バッファの長さ。
+ * @return なし
  */
 void guess_convert_to_system_encoding(char* strbuf, int buflen)
 {
@@ -448,7 +528,7 @@ void guess_convert_to_system_encoding(char* strbuf, int buflen)
                C_MAKE(work, buflen, char);
                my_strcpy(work, strbuf, buflen);
                if (!utf8_to_sys(work, strbuf, buflen)) {
-                       msg_print("·Ù¹ð:ʸ»ú¥³¡¼¥É¤ÎÊÑ´¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
+                       msg_print("警告:文字コードの変換に失敗しました");
                        msg_print(NULL);
                }
                C_KILL(work, buflen, char);