7

XMLを解析すると、異常な16進文字が含まれています。そこで、空きスペースに置き換えてみました。しかし、それはまったく機能しません。

元のキャラクター:�

hex code : (253, 255)

コード:

xmlData = String.replace(String.fromCharCode(253,255)," ");

retrun xmlData;

説明から「ýÿ」の文字を削除したいのですが。16進文字を空のスペースに置き換えるのに問題がある人はいますか?

回答に基づいて、コードを次のように変更しました。

testData = String.fromCharCode(253,255);
xmlData = xmlData.replace(String.fromCharCode(253,255), " "); 
console.log(xmlData);

ただし、画面には「�」と表示されます。

なぜこれがまだ起こるのか知っていますか?

4

3 に答える 3

8

文字コードは実際には 255 * 256 + 253 = 65533 なので、次のようになります。

xmlData = xmlData.replace(String.fromCharCode(65533)," ");

文字列String.fromCharCode(253,255)は 2 文字です。

于 2012-06-21T10:56:57.537 に答える
2

replace()ではなく、文字列インスタンスを呼び出す必要がありStringます。

var testData = String.fromCharCode(253,255);
var xmlData = testData.replace(String.fromCharCode(253,255), " ");
alert(xmlData);

実例: http://jsfiddle.net/StURS/2/

于 2012-06-21T10:01:06.307 に答える
1

有効なUTF-8コードと無効な強制的な手動変換の両方を含む混乱したSQLダンプでこの問題が発生しました。上記の例は置換に対応しておらず、より適切な一致を見つける方法を見つけていないため、同様のエンコーディングの問題に苦しんでいる人のために、ここに 2 セントを置いていると考えました。次のコード:

  1. 私のsql-dumpを解析します
  2. クエリに従って分割します
  3. 256 スコープ外の文字コードを検索します
  4. コードと、コードが表示されるコンテキストを含む文字列を出力します
  5. 正規表現を使用して、スウェーデン語の ÅÄÖ を正しいコードに置き換えます
  6. 制御用に置換された文字列を出力します
"use strict";

const readline = require("readline");
const fs = require("fs");

var fn = "my_problematic_sql_dump.sql";
var lines = fs.readFileSync(fn).toString().split(/;\n/);

const Aring = new RegExp(String.fromCharCode(65533) +
    "\\" + String.fromCharCode(46) + "{1,3}", 'g');
const Auml = new RegExp(String.fromCharCode(65533) +
    String.fromCharCode(44) + "{1,3}", 'g');
const Ouml = new RegExp(String.fromCharCode(65533) +
    String.fromCharCode(45) + "{1,3}", 'g');

for (let i in lines){
    let l = lines[i];
    for (let ii = 0; ii < l.length; ii++){
        if (l.charCodeAt(ii) > 256){
            console.log("\n Invalid code at line " + i + ":")
            console.log("Code: ", l.charCodeAt(ii), l.charCodeAt(ii + 1),
                l.charCodeAt(ii + 2), l.charCodeAt(ii + 3))

            let core_str = l.substring(ii, ii + 20)
            console.log("String: ", core_str)

            core_str = core_str.replace(/[\r\n]/g, "")
            .replace(Ouml, "Ö")
            .replace(Auml, "Ä")
            .replace(Aring, "Å")
            console.log("After replacements: ", core_str)
        }
    }
}

結果の出力は次のようになります。

 Invalid code at line 18:
Code:  65533 45 82 65533
String:  �-R�,,LDRALEDIGT', N
After replacements:  ÖRÄLDRALEDIGT', N

 Invalid code at line 18:
Code:  65533 44 44 76
String:  �,,LDRALEDIGT', NULL
After replacements:  ÄLDRALEDIGT', NULL

 Invalid code at line 19:
Code:  65533 46 46 46
String:  �...ker med fam till
After replacements:  Åker med fam till

注目に値することがわかったいくつかのこと:

  • 65533後に、実際の文字を決定するさまざまな数の通常の文字が続くことがあります。{1,3}
  • にはAringが含まれます.。つまり、何にでも一致し、追加の\\
于 2016-07-09T08:46:52.453 に答える