[Haxe] UTF8とSHIFT-JISをBytesデータで判別する ~ Bytes.ofString(str)

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