4

SQLiteデータベースにデータをとして保存していますBINARY(16)。その値は、32文字の16進文字列に対するPHPの関数によって決定されます。hex2bin

例として、文字列はを434e405b823445c09cb6c359fb1b7918返しますCN@[4EÀ¶ÃYûy

このデータベースに保存されているデータは、によって操作する必要がありますJavaScript。そのために、次の関数を使用しました(Andrisの回答をここに採用)。

// Convert hexadecimal to binary string
String.prototype.hex2bin = function ()
{

    // Define the variables
    var i = 0, l = this.length - 1, bytes = []

    // Iterate over the nibbles and convert to binary string
    for (i; i < l; i += 2)
    {
        bytes.push(parseInt(this.substr(i, 2), 16))
    }

    // Return the binary string
    return String.fromCharCode.apply(String, bytes)

}

CN@[4EÀ¶ÃYûyこれは期待どおりに機能し、から戻り434e405b823445c09cb6c359fb1b7918ます。

PHPただし、私が抱えている問題は、のhex2bin関数によって返されるデータを直接処理するときに、CN@[�4E����Y�yではなく文字列が与えられることですCN@[4EÀ¶ÃYûy。これにより、32文字の16進数を生成するために使用できる必要があるため、2つの間で作業することができなくなります(コンテキストとして、WebアプリJavaScriptから取得したデータを処理するオフラインiPadアプリに電力を供給するために使用されます)。文字列をバイナリ文字列に変換し、's関数(および' s関数)で動作させます。PHPJavaScriptPHPhex2binSQLiteHEX

この問題は、バイナリ文字列がとして保存されているのに対し、をJavaScript使用していると思います。それで、私の最初の考えは、文字列をに変換する必要があるということでした。Google検索を使用すると、ここに移動し、StackOverflowを検索すると、bobinceの回答がここに表示されます。どちらも、を使用することをお勧めします。ただし、これは必要なものを返します():UTF-16utf8_unicode_ciUTF-8unescape(encodeURIComponent(str))CN@[�4E����Y�y

// CN@[Â4EöÃYûy
unescape(encodeURIComponent('434e405b823445c09cb6c359fb1b7918'.hex2bin()))

それで、私の質問は次のとおりです。

JavaScript16進文字列を2進文字列に変換するにはどうすればよいUTF-8ですか?

4

3 に答える 3

2

16進数でエンコードされたUTF-8文字列`hex'が与えられた場合、

hex.replace(/../g, '%$&')

URIエンコードされたUTF-8文字列を生成します。

decodeURIComponentURIエンコードされたUTF-8シーケンスをJavaScriptUTF-16エンコードされた文字列に変換します。

decodeURIComponent(hex.replace(/../g, '%$&'))

適切に16進エンコードされたUTF-8文字列をデコードする必要があります。

ドキュメントの例に適用すると、機能することがわかりhex2binます。

alert(decodeURIComponent('6578616d706c65206865782064617461'.replace(/../g, '%$&')));
// alerts "example hex data"

ただし、指定した文字列はUTF-8でエンコードされていません。具体的には、

434e405b823445c09cb6c359fb1b7918
        ^

82は、少なくとも最初の2ビットが設定されたバイトの後に続く必要があります。5bはそのようなバイトではありません。

RFC2279は次のように説明しています。

次の表は、これらのさまざまなオクテットタイプの形式をまとめたものです。文字xは、UCS-4文字値のビットのエンコードに使用できるビットを示します。

UCS-4 range (hex.)           UTF-8 octet sequence (binary)
0000 0000-0000 007F   0xxxxxxx
0000 0080-0000 07FF   110xxxxx 10xxxxxx
0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
于 2013-03-18T17:06:46.343 に答える
1

アプリケーションは、どの時点でもバイナリを処理する必要はありません。挿入は可能な限り最新のポイントであり、最後にバイナリに変換する場所です。選択は可能な限り早いポイントであり、そこで16進数に変換し、アプリケーション全体で16進文字列を使用します。

UNHEX挿入するときは、blobリテラルに置き換えることができます。

INSERT INTO table (id)
VALUES (X'434e405b823445c09cb6c359fb1b7918')

選択すると、次のことができますHEX

SELECT HEX(id) FROM table
于 2013-03-18T19:18:15.850 に答える
0

マイクの答えを拡張して、ここにエンコードとデコードのためのいくつかのコードがあります。

escape/unescape()関数は非推奨になっていることに注意してください。それらのポリフィルが必要な場合は、http://jsfiddle.net/47zwb41oにあるより包括的なUTF-8エンコーディングの例を確認できます

// UTF-8 to hex
var utf8ToHex = function( s ){
    s = unescape( encodeURIComponent( s ) );
    var chr, i = 0, l = s.length, out = '';
    for( ; i < l; i++ ){
        chr = s.charCodeAt( i ).toString( 16 );
        out += ( chr.length % 2 == 0 ) ? chr : '0' + chr;
    }
    return out;
};

// Hex to UTF-8
var hexToUtf8 = function( s ){
    return decodeURIComponent( s.replace( /../g, '%$&' ) );
};
于 2017-01-18T06:43:38.063 に答える