如何在 UTF-8 語言環境中在 UTF-16LE 文件中進行正則表達式搜尋?
編輯:由於Warren Young的評論,這讓我意識到我在一個非常相關的點上並不清楚。我的搜尋字元串已經是 UTF-16LE 順序(不是 Unicode 程式碼點順序,即 UTF-16BE),所以也許 Unicode 問題有點沒有實際意義,
也許我的問題是如何在2-bytes組中查找字節(而不是字元) ,即。這樣 UTF-16LE
\x09\x0A
就不會被視為 TAB、換行符,而是恰好是 UTF-16LE 的 2 個字節ऊ
?… 注意:我不需要關心 UTF-16 代理對,所以 2 字節塊就可以了。這是此 3 字元字元串的範例模式
ऊपर
:
\x09\x0A\x09\x2A\x09\x30
但它什麼也不返回,儘管字元串在文件中。
(here is the original post)
在搜尋帶有
\x00\x01\x...etc
格式模式的UTF-16LE文件時,我遇到了一些值的問題。我一直在使用sed
(並嘗試過grep
),但是在 UTF-8 語言環境中,他們將一些 UTF-16LE 值辨識為 ASCII 字元。我被鎖定在使用 UTF-16,因此重新編碼為 UTF-8 不是一種選擇。例如。在此文本
ऊ
(UNICODE 090A) 中,雖然它是單個字元,但ऊ
被視為兩個 ASCII 字元\x09
和\x0A
.
grep
有一個-P
(perl)選項可以搜尋\x00\x...
模式,但我得到了相同的 ASCII 解釋。有沒有辦法
grep -P
在 UTF-16 模式下搜尋,或者更好,如何做到這一點是 perl 或其他腳本。
grep
由於它的緊湊性,它似乎是最吸引人的,但無論完成什麼工作都會超越這種偏好。附言; 我的
ऊ
範例使用文字字元串,但我的實際使用需要正則表達式樣式搜尋。所以這個 perl 範例並不是我所追求的,儘管它確實將文件處理為 UTF-16……我寧願不必打開和關閉文件……我認為perl
有更緊湊的基本方法諸如正則表達式搜尋之類的東西。我正在追求具有這種緊湊語法的東西。
我的回答與您關於此主題的其他問題基本相同:
$ iconv -f UTF-16LE -t UTF-8 myfile.txt | grep pattern
與另一個問題一樣,您可能也需要行結束轉換,但關鍵是您應該將文件轉換為本地編碼,以便您可以直接使用本機工具。
我相信 Warren 的回答是一個更好的*通用**nix 解決方案,但是這個 perl 腳本完全按照我的意願工作(對於我有點不標準的情況)。它確實需要我稍微改變搜尋模式的目前格式:
從
\x09\x0A\x09\x2A\x09\x30\x00\s09
到
\x{090A}\x{092A}\x{0930}\x{0009}
它在一個過程中完成所有事情,這尤其是我所追求的。
#! /usr/bin/env perl use strict; use warnings; die "3 args are required" if scalar @ARGV != 3; my $if =$ARGV[0]; my $of =$ARGV[1]; my $pat=$ARGV[2]; open(my $ifh, '<:encoding(UTF-16LE)', $if) or warn "Can't open $if: $!"; open(my $ofh, '>:encoding(UTF-16LE)', $of) or warn "Can't open $of: $!"; while (<$ifh>) { print $ofh $_ if /^$pat/; }