うたブログ〜情報編: 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;
}
}