有効なUTF-8コードと無効な強制的な手動変換の両方を含む混乱したSQLダンプでこの問題が発生しました。上記の例は置換に対応しておらず、より適切な一致を見つける方法を見つけていないため、同様のエンコーディングの問題に苦しんでいる人のために、ここに 2 セントを置いていると考えました。次のコード:
- 私のsql-dumpを解析します
- クエリに従って分割します
- 256 スコープ外の文字コードを検索します
- コードと、コードが表示されるコンテキストを含む文字列を出力します
- 正規表現を使用して、スウェーデン語の ÅÄÖ を正しいコードに置き換えます
- 制御用に置換された文字列を出力します
"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
が含まれます.
。つまり、何にでも一致し、追加の\\