Unicode文字には、それぞれ異なるプロパティが関連付けられています。これらのプロパティはコードポイントから導出することはできません。文字が特定のプロパティを持っているかどうかを示す表が必要です。
双方向プロパティ「R」または「AL」(RandALCat)の文字に興味があります。
RandALCat文字は、明示的に右から左への方向性を持つ文字です。ここで
D. Bidirectional tables
D.1 Characters with bidirectional property "R" or "AL"
----- Start Table D.1 -----
05BE
05C0
05C3
05D0-05EA
05F0-05F4
061B
061F
0621-063A
0640-064A
066D-066F
0671-06D5
06DD
06E5-06E6
06FA-06FE
0700-070D
0710
0712-072C
0780-07A5
07B1
200F
FB1D
FB1F-FB28
FB2A-FB36
FB38-FB3C
FB3E
FB40-FB41
FB43-FB44
FB46-FBB1
FBD3-FD3D
FD50-FD8F
FD92-FDC7
FDF0-FDFC
FE70-FE74
FE76-FEFC
----- End Table D.1 -----
のUnicode 6.0のような完全なリストを取得するためにいくつかのコードです:
ここで(RFC 3454から)は、Unicode 3.2の完全なリストがあります
var url = "http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt";
var query = from record in new WebClient().DownloadString(url).Split('\n')
where !string.IsNullOrEmpty(record)
let properties = record.Split(';')
where properties[4] == "R" || properties[4] == "AL"
select int.Parse(properties[0], NumberStyles.AllowHexSpecifier);
foreach (var codepoint in query)
{
Console.WriteLine(codepoint.ToString("X4"));
}
なお、これらの値Unicodeコードポイントです。 C#/ .NETの文字列はUTF-16でエンコードされているため、最初にUnicodeコードポイントに変換する必要があります(Char.ConvertToUtf32参照)。あなたが「named blocks」regular expressionsでを使用して試すことができます
static void IsAnyCharacterRightToLeft(string s)
{
for (var i = 0; i < s.Length; i += char.IsSurrogatePair(s, i) ? 2 : 1)
{
var codepoint = char.ConvertToUtf32(s, i);
if (IsRandALCat(codepoint))
{
return true;
}
}
return false;
}
出典
2010-12-02 02:31:58
dtb
ありがとうございました!私は、あなたがブレントのアプローチについてどう思っているのだろうかと思っていました。 –
@Patrick Kluge:正規表現エンジンには、Unicodeプロパティのテーブルが含まれているようです。しかし、私はすべてのRandALCat文字の名前付きブロックは表示されません。したがって、必要な正しさのレベルに依存します。アラビア語やヘブライ語などの文字を検出できれば、正規表現に行くことができます。存在するRandALCat文字を検出する必要がある場合は、独自のテーブルを作成し、上記のように入力文字列を自分で確認してください。 – dtb
私は、GoogleのChromeやMS Wordなどのソフトウェア製品によって右から左に扱われる۞シンボルの何があなたのものか疑問に思っていますが、ユニコード仕様ではRandALCatとしてマークされていません。 –