2012-06-21 54 views
1

當我解析XML時,它包含非正常的十六進制字符。 所以我試圖用空的空間替換它。但它根本不起作用。string.replace(fromCharCode(),'')不能替換字符

原有的特色:

hex code : (253, 255) 

代碼:

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

retrun xmlData; 

我想從描述中刪除 「YY」 的字符。 是否有人將空格替換爲十六進制字符時遇到麻煩?

基礎上的答案,我已經修改了代碼如下:

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

,但它仍然顯示「」在屏幕上..

你知道爲什麼這仍然發生?

回答

2

你應該在一個字符串實例調用replace()String

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

工作例如:http://jsfiddle.net/StURS/2/

+0

感謝您的意見。 但它也無法正確解析異常字符。 這裏是我修改後的代碼.. testData = String.fromCharCode(253,255); xmlData = xmlData.replace(String.fromCharCode(253,255),「」); console.log(xmlData); 但它仍然顯示' '在屏幕上.. 你知道嗎?它仍然發生? – user1127017

2

字符代碼實際上是255 * 256 + 253 = 65533,所以你會得到的東西像這樣:

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

字符串String.fromCharCode(253,255)是兩個字符。

+0

[鏈接](http://jsfiddle.net/y92nc/)。 – Leonid

0

剛剛遇到了包含有效的UTF-8代碼和無效強制進行更多手動轉換的混亂SQL轉儲的問題。由於上面的例子沒有解決替換和尋找更好的匹配,我想我把我的兩分錢放在那裏,爲那些正在努力解決類似的編碼問題。以下代碼:

  1. 根據查詢解析我的SQL轉儲
  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包含.,即匹配anyth並需要額外的\\
相關問題