我有一個合理大小的平面文件數據庫,主要以8859格式保存,通過Web表單(使用Perl腳本)收集。直到最近,我在共同1252個字符(彎引號,頓號等)一套簡單的正則表達式的進行談判:在Perl中以utf8模式打開的ASCII文本文件中過濾微軟1252個字符
$line=~s/\x91/\&\#8216\;/g; # smart apostrophe left
$line=~s/\x92/\&\#8217\;/g; # smart apostrophe right
...等
但是自從我決定我該走了Unicode,並且已經將所有腳本轉換爲讀入並輸出utf8(這對所有新材料都適用),這些(現有的)1252字符的正則表達式不再有效,我的Perl html輸出字面上輸出了4個字符:'\ x92'和'\ x93'等(至少這是它在utf8模式下如何在瀏覽器上顯示,下載(ftp不是http),並在文本編輯器(文本板)中打開它不同,單個未定義字符仍然存在,輸出文件在Firefox默認(沒有內容類型標題)8859模式呈現正確的字符)。
在腳本的開始新的UTF8編譯指示是:
使用CGI QW(-utf8); 使用open IO =>':utf8';
據我所知,這是由於utf8模式使字符雙字節而不是單字節,並適用於0x80到0xff範圍內的字符,閱讀了有關這個wikibooks的文章,但我不聰明至於如何過濾它們。理想情況下,我知道我應該以utf8模式重新保存所有文檔(因爲平面文件數據庫現在包含8859和utf8的混合),但是如果我要這樣做,首先我需要某種過濾器。
對於內部的2字節存儲空間我可能是錯誤的,因爲它似乎意味着Perl根據各種情況處理的東西非常不同。
如果有人能給我提供正則表達式的解決方案,我將非常感激。或者其他一些方法。我曾經多次嘗試過,並且在黑客攻擊方面一直在嘲笑我的頭髮數週。只有大約6 1252個字符通常需要替換,並且使用過濾器方法,我可以在utf8中重新保存整個flippin並忘記曾經存在過1252個字符...
哦......我不能簡單的復位在8859和過濾器打開文件以來,DB現在包含UTF8和8859.哎呦。 – Beeblbrox