2012-07-25 78 views
7

我比較字符串並且必須替換JS中的變音符號,但似乎JS不能識別字符串中的變音符號。文本來自數據庫,在瀏覽器中,變音符號顯示正常。替換JS中的變音符號

function replaceUmlauts(string) 
{ 
    value = string.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    return value; 
} 

隨着搜索模式我想:

  • 「A」, 「O」, 「U」
  • /A /,/ O /,/ U/
  • ä」 「ö」,「ü」(以及徹底的絕望;-))

可以肯定,它不是與替換功能的問題我試過的indexOf:

console.log(value.indexOf('ä')); 

,但所有模式的輸出是:-1

所以我想這是某種帶有編碼的問題,但正如我在頁面上說,變音不只是看起來不錯。

任何想法?這看起來很簡單...

編輯: 即使我找到我的答案,問題並沒有真正解決「在根」(編碼)。 這是我的網頁編碼:

<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 

數據庫有:utf8_general_ci

似乎完全好了給我。

+1

你在數據庫中使用什麼編碼你在你的網頁中使用什麼編碼? – Marc 2012-07-25 15:10:02

+0

什麼是字符串?記錄它。您的方法可行,但正如您從indexOf中看到的那樣,您的字符串不包含「ä」。 – Bergi 2012-07-25 15:11:12

+0

'「bäg」.replace(/ä/ g,「ae」); // ==>「baeg」',所以有些東西很可能與你的編碼不​​符 – 2012-07-25 15:14:02

回答

21

要麼確保你的腳本編碼正確指定(在<script>標籤或頁面的頁眉/元,如果它嵌入)或指定符號這將始終毫不含糊地解析爲某個特定的Unicode代碼點。

例如:

str.replace(/\u00e4/g, "ae") 

將始終與AE替換,不管是什麼編碼設置爲您的網頁/腳本,即使它是不正確。

下面是需要日耳曼語言代碼:

// Ü, ü  \u00dc, \u00fc 
// Ä, ä  \u00c4, \u00e4 
// Ö, ö  \u00d6, \u00f6 
// ß  \u00df 
+0

非常感謝你,這個工程:-)我在頁面上有utf-8編碼:看起來完全正確我,所以我將只與工作...... – SamiSalami 2012-07-26 08:13:48

+0

這裏有更多的代碼:// U,U \t \t \ u00dc,\ u00fc // A,A \t \t \ u00c4,\ u00e4 // Ö,ö\t \t \ u00d6,\ u00f6 // \t \t \ u00df – 2017-01-19 22:10:09

+0

Å對於北歐國家://Å,å:\ u00c5,\ u00e5 – 2017-05-18 09:14:50

1

您需要先弄清楚您要替換的字符代碼是什麼。例如,根據字符編碼,字符可以是8859,UTF-8或其他。他們也可以是字符符號,如「ä」

而不是猜測,打印出來。

請注意,您的傳入數據可能不會一致地使用相同的字符集/字符編碼 - 您需要檢查數據來自何處。

所以使用字符串來看看傳入的數據。 charCodeAt

檢查toLowerCase之前的字符代碼以確保它不會改變您的操作。你需要逐步調試。

最後,在您的編輯器中檢查字符集設置,以確保您鍵入的字符是它應該是。您可能希望通過UTF8值與\uNNNN語法指定它,而不是打字,ö等

+2

無論你在頁面中使用什麼編碼,在JS中一切都是Unicode和變音符**總是**相同的代碼。 – 2012-07-25 15:15:03

+0

我認爲我的文檔編碼(我的文件在編輯器中)並不重要,因爲文本來自數據庫,所以只有數據庫和html元標記中的編碼應該重要或不重要?而你的函數格式比較混亂,應該是string.charCodeAt(0); (0是第一個位置),但我真的沒有想到它,這是一個很好的線索,不幸的是它並沒有幫助 - 正確的unicode是在toLowerCase之前以及之後返回的。 – SamiSalami 2012-07-26 08:11:44

6

下面是取代最常見的字符產生谷歌友好的SEO鏈接功能:

function deUmlaut(value){ 
    value = value.toLowerCase(); 
    value = value.replace(/ä/g, 'ae'); 
    value = value.replace(/ö/g, 'oe'); 
    value = value.replace(/ü/g, 'ue'); 
    value = value.replace(/ß/g, 'ss'); 
    value = value.replace(/ /g, '-'); 
    value = value.replace(/\./g, ''); 
    value = value.replace(/,/g, ''); 
    value = value.replace(/\(/g, ''); 
    value = value.replace(/\)/g, ''); 
    return value; 
}