Mac を経由すると困ったことに濁音・半濁音が2文字に分離されてる場合があるらしく、
PostgreSQL 等にそのまま食わせると EUC-JP に変換出来ない等の弊害が生じる模様。
Excel から xyzzy にテキストを貼り付けた場合も文字化けが生じた。
どっちが正しいあり方なのかは知らないが、こういう基本的な部分で互換性がないのは甚だ迷惑な話だ。
参考:
PostgreSQL 等にそのまま食わせると EUC-JP に変換出来ない等の弊害が生じる模様。
Excel から xyzzy にテキストを貼り付けた場合も文字化けが生じた。
どっちが正しいあり方なのかは知らないが、こういう基本的な部分で互換性がないのは甚だ迷惑な話だ。
/** * UTF-8 関連のユーティリティ * Copyright (c) 2011 Koichi OKADA. All rights reserved. * License: Modified BSD Style License. */ class UTF8Utils { private static $SEPARATED_KANA_SOUND = array( "\xe3\x82\x99" /* ゛ */ => 0, // 分離濁音? "\xe3\x82\x9a" /* ゜ */ => 1, // 分離半濁音? //"\xe3\x82\x9b" /* ゛ */ => 0, // 濁音? //"\xe3\x82\x9c" /* ゜ */ => 1, // 半濁音? ); private static $SEPARATED_KANA_SOUND_TABLE = array( "\xe3\x81\x86" /* う */ => array("\xe3\x82\x94" /* ヴ */), "\xe3\x81\x8b" /* か */ => array("\xe3\x81\x8c" /* が */), "\xe3\x81\x8d" /* き */ => array("\xe3\x81\x8e" /* ぎ */), "\xe3\x81\x8f" /* く */ => array("\xe3\x81\x90" /* ぐ */), "\xe3\x81\x91" /* け */ => array("\xe3\x81\x92" /* げ */), "\xe3\x81\x93" /* こ */ => array("\xe3\x81\x94" /* ご */), "\xe3\x81\x95" /* さ */ => array("\xe3\x81\x96" /* ざ */), "\xe3\x81\x97" /* し */ => array("\xe3\x81\x98" /* じ */), "\xe3\x81\x99" /* す */ => array("\xe3\x81\x9a" /* ず */), "\xe3\x81\x9b" /* せ */ => array("\xe3\x81\x9c" /* ぜ */), "\xe3\x81\x9d" /* そ */ => array("\xe3\x81\x9e" /* ぞ */), "\xe3\x81\x9f" /* た */ => array("\xe3\x81\xa0" /* だ */), "\xe3\x81\xa1" /* ち */ => array("\xe3\x81\xa2" /* ぢ */), "\xe3\x81\xa4" /* つ */ => array("\xe3\x81\xa5" /* づ */), "\xe3\x81\xa6" /* て */ => array("\xe3\x81\xa7" /* で */), "\xe3\x81\xa8" /* と */ => array("\xe3\x81\xa9" /* ど */), "\xe3\x81\xaf" /* は */ => array("\xe3\x81\xb0" /* ば */, "\xe3\x81\xb1" /* ぱ */), "\xe3\x81\xb2" /* ひ */ => array("\xe3\x81\xb3" /* び */, "\xe3\x81\xb4" /* ぴ */), "\xe3\x81\xb5" /* ふ */ => array("\xe3\x81\xb6" /* ぶ */, "\xe3\x81\xb7" /* ぷ */), "\xe3\x81\xb8" /* へ */ => array("\xe3\x81\xb9" /* べ */, "\xe3\x81\xba" /* ぺ */), "\xe3\x81\xbb" /* ほ */ => array("\xe3\x81\xbc" /* ぼ */, "\xe3\x81\xbd" /* ぽ */), "\xe3\x82\x9d" /* ゝ */ => array("\xe3\x82\x9e" /* ゞ */), "\xe3\x82\xa6" /* ウ */ => array("\xe3\x83\xb4" /* ヴ */), "\xe3\x82\xab" /* カ */ => array("\xe3\x82\xac" /* ガ */), "\xe3\x82\xad" /* キ */ => array("\xe3\x82\xae" /* ギ */), "\xe3\x82\xaf" /* ク */ => array("\xe3\x82\xb0" /* グ */), "\xe3\x82\xb1" /* ケ */ => array("\xe3\x82\xb2" /* ゲ */), "\xe3\x82\xb3" /* コ */ => array("\xe3\x82\xb4" /* ゴ */), "\xe3\x82\xb5" /* サ */ => array("\xe3\x82\xb6" /* ザ */), "\xe3\x82\xb7" /* シ */ => array("\xe3\x82\xb8" /* ジ */), "\xe3\x82\xb9" /* ス */ => array("\xe3\x82\xba" /* ズ */), "\xe3\x82\xbb" /* セ */ => array("\xe3\x82\xbc" /* ゼ */), "\xe3\x82\xbd" /* ソ */ => array("\xe3\x82\xbe" /* ゾ */), "\xe3\x82\xbf" /* タ */ => array("\xe3\x83\x80" /* ダ */), "\xe3\x83\x81" /* チ */ => array("\xe3\x83\x82" /* ヂ */), "\xe3\x83\x84" /* ツ */ => array("\xe3\x83\x85" /* ヅ */), "\xe3\x83\x86" /* テ */ => array("\xe3\x83\x87" /* デ */), "\xe3\x83\x88" /* ト */ => array("\xe3\x83\x89" /* ド */), "\xe3\x83\x8f" /* ハ */ => array("\xe3\x83\x90" /* バ */, "\xe3\x83\x91" /* パ */), "\xe3\x83\x92" /* ヒ */ => array("\xe3\x83\x93" /* ビ */, "\xe3\x83\x94" /* ピ */), "\xe3\x83\x95" /* フ */ => array("\xe3\x83\x96" /* ブ */, "\xe3\x83\x97" /* プ */), "\xe3\x83\x98" /* ヘ */ => array("\xe3\x83\x99" /* ベ */, "\xe3\x83\x9a" /* ペ */), "\xe3\x83\x9b" /* ホ */ => array("\xe3\x83\x9c" /* ボ */, "\xe3\x83\x9d" /* ポ */), "\xe3\x83\xbd" /* ヽ */ => array("\xe3\x83\xbe" /* ヾ */)); /** * UTF-8 で濁音・半濁音が分離されている場合に、1文字に統合します。 */ public static function merge_sound($src) { $regex_encoding = mb_regex_encoding(); $dst = $c1 = $c2 = ""; $len = mb_strlen($src, "UTF-8"); for ($i = 0; $i < $len; $i++) { $c2 = mb_substr($src, $i, 1, "UTF-8"); if (isset(self::$SEPARATED_KANA_SOUND[$c2])) { $idx = self::$SEPARATED_KANA_SOUND[$c2]; if (isset(self::$SEPARATED_KANA_SOUND_TABLE[$c1][$idx])) { $c1 = self::$SEPARATED_KANA_SOUND_TABLE[$c1][$idx]; } else { throw new Exception("Illegal charactor before 'Japanese UTF-8 separated kana sound'."); } $c2 = ""; } $dst .= $c1; $c1 = $c2; } $dst .= $c1; return $dst; } };
コメントをかく