簡體   English   中英

匹配不間斷空格時格式錯誤的UTF-8字符

[英]Malformed UTF-8 character when matching Non Breaking Space

我在我的perl程序中使用utf8,並且獲得了以下代碼行:

$$pstring =~ s/\xA0/ /g; 

應該從字符串中清除不間斷空格。

在Ubuntu 16.04和perl v5.22.1下,這不是問題,但是在Ubuntu 14.04和v5.18.2下,我得到此錯誤:

格式錯誤的UTF-8字符(致命)

然后,我檢查了要匹配的字符串,發現其中存在不間斷的空格,可以通過正則表達式刪除

$$pstring =~ s/[\xC2\xA0]/ /g;

但不是

$$pstring =~ s/\xC2\xA0/ /g;

我的問題是:最后兩個之間有什么區別(為什么它僅適用於括號),還有另一種解決方法嗎?

我的猜測是您要處理的是原始的,UTF-8編碼的字符串。 您尚未顯示如何獲得它,也未說明為什么要這樣做。 一個小型完整的演示程序,它將顯示您如何獲得輸入,如何更改輸入以及最終抱怨什么,這將幫助人們發現問題。 如果您將小型演示程序添加到您的問題中,我也許可以給出更好(甚至不同)的答案。

不間斷空格的代碼為U + 00A0。 在UTF-8下,它編碼為兩個八位字節\\ xC2和\\ xA0。 U + 007F以上的代碼均具有UTF-8下的多八位字節編碼。 U + 007F下的所有內容實際上都只是ASCII,因此ASCII可以用作UTF-8。

如果您使用不間斷空格的UTF-8編碼文本並僅刪除\\xA0八位位組,則剩下一個孤獨的\\xC2 根據之后發生的情況,這可能是一個問題。 UTF-8旨在識別問題出在哪里,並自行糾正。 它可以在下一個合法編碼的字符處拾取,並留下替換字符來標記錯誤。 或者,程序可能會抱怨並放棄。

當您使用字符類[\\xC2\\xA0] ,我猜想它會消除出現這些字符的任何一個字節。 由於您沒有報告任何其他錯誤,因此我猜\\xC2不會出現在其他任何地方。 否則,其他字符可能會更改。 或者,您正在處理擴展的ASCII,並且刪除\\xC2正確的Latin-1編碼。 s///報告的替換數是否等於(或兩倍)不間斷空格?

如果您使用UTF-8編碼的文本,則將其讀取為UTF-8:

open my $fh, '<:utf8', $filename or die ...

讀取數據后,不必擔心編碼。 使用代碼號,Perl會弄清楚。 或者使用代碼名稱,以便將來的程序員無需查找字符就知道您在做什么:

my $string =~ s/\x{00A0}/ /g;
my $string =~ s/\N{NO-BREAK SPACE}/ /g;

完成后,將其編寫為UTF-8文本:

open my $fh, '>:utf8', $filename or die ...

最新的Learning Perl在背面有Unicode入門,其中包括很多內容。

祝好運!

暫無
暫無

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

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