うたブログ〜情報編: UTF8とSHIFT-JISの判別し方の記事を参考にして、Haxeで文字列がUTF-8かSJISなのかを大雑把に見分ける関数を作りました。
Haxeの内部文字コードがUTF-8なので、外部ファイルを読み込む際に、SJIS(主にWindowsのテキストファイル)なら文字コードの変換が必要なためです。SJIS、UTF-8の2択に決め打ちしているのでご注意。
ロジックについては、上記ブログを参照していただければ、と思います。LeDAさん、ありがとうございます★
import haxe.io.Bytes; class CharCodeGuess { public static function isSJIS(str:String):Bool { if (str == null || str == "") { return false; } var bytes = Bytes.ofString(str); var pos = 0; var inUTFCount = 0; var inSJISCount = 0; while (pos < bytes.length) { var b : Int = bytes.get(pos); pos++; if (inUTFCount > 0 && (b < 0x80 || 0xbf < b)) { return true; } if (inSJISCount > 0 && (b < 0x40 || b > 0xfc) ) { return false; } if (0xa1 <= b && b <= 0xdf && inUTFCount == 0) { // 1 byte hankaku is not used in UTF-8 return true; } else if (0xf0 <= b && b <= 0xfd && inSJISCount == 0) { // sjis is not use this region return false; } else if (0x80 <= b && b <= 0x9f) { if (inUTFCount <= 0) { return true; } else if (inSJISCount == 0) { inSJISCount = 2; } } else if (0xc2 <= b && b <= 0xdf && inUTFCount == 0) { inUTFCount = 2; } else if (0xe0 <= b && b <= 0xef && inUTFCount == 0) { inUTFCount = 3; } if (inUTFCount > 0) { inUTFCount -= 1; } if (inSJISCount > 0) { inSJISCount--; } } return false; } }