2014-04-01 90 views
1

我有UTF-8頭頁:的JavaScript編碼問題與重音字符

<meta charset="utf-8" /> 

,並在頁面我用一把umbraco字典來獲取各種語言的內容。 當我打印這個德國在頁面上看起來罰款:

<h1>@library.GetDictionaryItem("A")</h1> 

解析爲:

在德國

<h1>Ä</h1>但是如果我通過腳本輸入:

<script type="text/javascript" charset="utf-8"> 
    var a = "@library.GetDictionaryItem("A")"; 
    alert(a); 
</script> 

提醒打印:

&#228; 

如果我做

<script type="text/javascript" charset="utf-8"> 
    var a = "Ä"; 
    alert(a); 
</script> 

警報打印:

Ä 

那麼,什麼可以解釋這種行爲,我怎麼能解決的警報? 據我所見,一切都是UTF-8,字典和頁面編碼都很好。問題發生在Javascript中。

從我在這裏的表中可以看到,Javascript將字符解析爲它的數字值。我用「escape,encodeUrl,decodeUrl」等沒有運氣。

chr HexCode Numeric HTML entity  escape(chr) encodeURI(chr) 

ä \xE4  &#228; &auml;   %E4   %C3%A4 
+0

」JavaScript將字符解析爲其數值「 - 否。字符引用將由您的服務器端代碼生成。它以HTML格式輸出時看起來不錯,因爲字符引用在HTML中有特殊含義(但不在JavaScript中)。 – Quentin

+0

好吧,那麼如何才能讓警報像我輸入一樣? – Nick

+0

這是(大概)一個umbraco字典問題,我從來沒有聽說過。 – Quentin

回答

2

(FWIW:字符實體&#228;ä,不Ä

這有什麼好做的字符編碼。您將一個HTML 實體輸出到JavaScript字符串,然後要求瀏覽器顯示該JavaScript字符串而不做任何事情來解釋HTML(通過alert)。這正是好像你實際鍵入:

<h1>&#228;</h1> 

...(這將顯示在頁面上ä),並

<script> 
var a = "&#228;"; 
alert(a); 
</script> 

...哪些不會。 HTML實體沒有在理解HTML實體的任何地方使用。 alert不解釋HTML。

但是,如果你這樣做:

<script> 
var a = "&#228;"; 
var div = document.createElement('div'); 
div.innerHTML = a; 
document.body.appendChild(div); 
</script> 

...你會看到頁面上的文字,因爲我們給出了實體的東西(innerHTML),將解釋HTML。所以,如果你進行第一次行:

var a = "@library.GetDictionaryItem("A")"; 

...然後使用在HTML中的上下文a(如上),你會得到的文檔中ä

如果總是得到一把umbraco一個十進制數字字符實體(如&#228;),因爲這些定義的Unicode代碼點,並在其串* JavaScript的(大部分)使用Unicode代碼點,你可以解析實體足夠容易:

function characterFromDecimalNumericEntity(str) { 
    var decNumEntRex = /^\&#(\d+);$/; 
    var match = decNumEntRex.exec(str); 
    var codepoint = match ? parseInt(match[1], 10) : null; 
    var character = codepoint ? String.fromCharCode(codepoint) : null; 
    return character; 
} 
alert(characterFromDecimalNumericEntity("&#228;")); // ä 

Live Example

*爲什麼 「大多是」:JavaScript的字符串是由的對應於UTF-16 代碼單元,不是Unicode代碼點的16位 「字符」(你不能ST在16位中提供一個Unicode代碼點,你需要21)。來自Basic Multilingual Plane的所有字符都在一個UTF-16代碼單元內,但Supplementary Multilingual Plane,,and so on中的字符需要兩個字符的UTF-16代碼單元。其中一個字符將佔用JavaScript字符串中的兩個「字符」。上面的函數會失敗。更多信息請見the JavaScript specthe Unicode FAQ。 「

+0

中的重音字符是的,不能說我完全理解它。 我發現創建一個div元素,並使用內置的html分析器來打印出一個字符是非常優雅 – Nick

+2

@Nick:TJC並沒有告訴你如何解決你的問題,但解釋下面發生了什麼。你可能需要閱讀它,直到你完全理解它。然後你可以考慮解決方案。 –

+1

@尼克:當然沒有,我只是證明這裏真正的問題是你得到了一個HTML實體('ä'),所以你需要在HTML上下文中解釋它,使其被渲染爲'Ä'。如果你總是得到十進制數字實體,我只是給答案添加了一些東西,而你想在JavaScript中使用它們而不是在HTML中使用它們。 –