剛剛遇到了包含有效的UTF-8代碼和無效強制進行更多手動轉換的混亂SQL轉儲的問題。由於上面的例子沒有解決替換和尋找更好的匹配,我想我把我的兩分錢放在那裏,爲那些正在努力解決類似的編碼問題。以下代碼:
- 根據查詢解析我的SQL轉儲
- 分裂
- 發現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
包含.
,即匹配anyth並需要額外的\\
感謝您的意見。 但它也無法正確解析異常字符。 這裏是我修改後的代碼.. testData = String.fromCharCode(253,255); xmlData = xmlData.replace(String.fromCharCode(253,255),「」); console.log(xmlData); 但它仍然顯示' '在屏幕上.. 你知道嗎?它仍然發生? – user1127017