2012-06-07 61 views
3

給定一個輸入字符串,生成一個輸出字符串,其中刪除所有無效序列或用U + FFFD替換。如何在JavaScript中檢測並刪除無效的Unicode序列

是否有比實現狀態機char-by-char或非本地node.JS模塊更好的方法?

無效序列例如是孤兒代替物"\uD800"或其他無效多字符序列。

+0

除了代理之外,你還想要刪除什麼?你想刪除U + FFFF這樣的非字符嗎? (這對於非BMP字符會很惱人。)還是尚未分配的代碼點? – bobince

+0

應用程序可以在內部使用非字符和未分配的代碼點,以免產生不良影響,因此我不想刪除它們。如果除了孤兒代理之外沒有適當的無效序列,那很好。 – OrangeDog

回答

2

匹配無效序列所需的正則表達式取決於您想包含的內容。要替換U + FFFD孤立的替代品,你可以使用這樣的事情:

var surrogates = /[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; 
str = str.replace(surrogates , function ($0) { 
    return $0.length > 1 ? $0 : '\ufffd'; 
}); 

如果使用XRegExp圖書館以其Unicode addons,你可以用它代替[\ud800-\udfff]\p{Cs}\p{Surrogate}的Unicode類別。使用XRegExp還可讓您輕鬆訪問其他潛在相關的Unicode屬性,如\p{Noncharacter_Code_Point},\p{Co}\p{Private_Use}\p{Cn}\p{Unassigned}

由於您使用Node.js,您可以使用npm install xregexp通過npm通過install XRegExp。 XRegExp的npm模塊自動包含Unicode插件。