簡體   English   中英

刪除字符串中的非ascii字符

[英]Remove non-ascii character in string

var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

我需要從字符串中刪除所有非ascii字符,

意味着str只包含“INFO](Higashikurume)”;

ASCII的范圍是0到127,所以:

str.replace(/[^\x00-\x7F]/g, "");

它也可以通過正面的刪除聲明來完成,如下所示:

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

這使用unicode。 在Javascript中,當表達正則表達式的unicode時,字符用轉義序列\\u{xxxx}指定,但標志'u'必須存在; 注意正則表達式有標志'gu'

我稱這是一個“正面的刪除斷言”,意思是“正面”斷言表示要刪除哪些字符,而“否定”斷言則表示哪些字母不能刪除。 在許多情況下,如先前答案中所述,否定主張可能對讀者更具啟發性。 \\x00-\\x7F^ ”表示“不”,范圍\\x00-\\x7F表示“ascii”,因此兩者一起說“不是ascii”。

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

對於只關心英語的英語使用者而言,這是一個很好的解決方案,對於原始問題也是一個很好的答案。 但在更一般的背景下,人們不能總是接受假設“所有非ascii都不好”的文化偏見。 對於使用非ascii但偶爾需要刪除的上下文,Unicode的正面斷言更適合。

字符串中嵌入零寬度非打印字符的一個很好的指示是當字符串的“長度”屬性為正(非零)時,但看起來像(即打印為)空字符串。 例如,我在Chrome調試器中顯示了一個名為“textContent”的變量:

> textContent
""
> textContent.length
7

這促使我想要查看該字符串中的內容。

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

這個字節序列似乎是一些Unicode字符的族,它們被字處理器插入到文檔中,然后進入數據字段。 最常見的是,這些符號出現在文檔的末尾。 CK-Editor(CKEditor)可以插入零寬度空間"%E2%80%8B"

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   ​  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   ‎  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   ‏  right-to-left-mark

一些參考文獻:

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

請注意,雖然嵌入字符的編碼是UTF-8,但正則表達式中的編碼不是。 盡管字符在字符串中嵌入了UTF-8的三個字節(在我的例子中),但正則表達式中的指令必須使用雙字節Unicode。 實際上,UTF-8最長可達4個字節; 它不如Unicode那么緊湊,因為它使用高位(或位)來逃避標准的ascii編碼。 這在這里解釋:

https://en.wikipedia.org/wiki/UTF-8

您可以使用以下正則表達式替換非ASCII字符

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

但請注意,空格,冒號和逗號都是有效的ASCII,因此結果將是

> str
"INFO] :, , ,  (Higashikurume)"

要使用帶重音的ASCII:

var str = str.replace(/[^\x00-\xFF]/g, "");

這些答案都沒有正確處理選項卡,換行符,回車符,有些不處理擴展的ASCII和unicode。 這將保留選項卡和換行符,但刪除控制字符和ASCII集之外的任何內容。 單擊“運行此代碼段”按鈕進行測試。 有一些新的javascript下來管道,所以在未來(2020+?)你可能不得不做\\u{FFFFF}但還沒有

 console.log("line 1\\nline2 \\n\\ttabbed\\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\\x00-\\x08\\x0E-\\x1F\\x7F-\￿]/g, '')) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM