私は、複数の文字で構成された特殊文字を数える方法を見つけましたが、オンラインで解決策が見つかりませんでした。特殊なUTF-8文字を数えよう
私は文字列 "வாழைப்பழம"を数えたいと思う。実際にはタミル文字は6文字ですが、通常の方法で長さを検索すると9文字になります。私はこの問題を引き起こすエンコーディングの唯一の種類であり、これに対する解決策があるのだろうかと疑問に思っています。私は現在、C#で解決策を見つけようとしています。
は
私は、複数の文字で構成された特殊文字を数える方法を見つけましたが、オンラインで解決策が見つかりませんでした。特殊なUTF-8文字を数えよう
私は文字列 "வாழைப்பழம"を数えたいと思う。実際にはタミル文字は6文字ですが、通常の方法で長さを検索すると9文字になります。私はこの問題を引き起こすエンコーディングの唯一の種類であり、これに対する解決策があるのだろうかと疑問に思っています。私は現在、C#で解決策を見つけようとしています。
は
利用StringInfo.LengthInTextElements
)=事前にありがとう:
var text = "வாழைப்பழம";
Console.WriteLine(text.Length); // 9
Console.WriteLine(new StringInfo(text).LengthInTextElements); // 6
この挙動の説明はString.Lengthのドキュメントに記載されています:
長プロパティが返しますこのインスタンスのCharオブジェクトの数。Unicode文字の数ではありません。その理由は、Unicode文字が複数のCharで表される可能性があるからです。
System.Globalization.StringInfo
クラスを使用して、各Charの代わりに各Unicode文字を処理します。
マイナーnitpick:.NET用のUTF-16でstring
のではなく、UTF-8
あなたは、文字列の長さの話をしているとき、あなたは可能性がいくつかの異なるものがあります平均:
あなたのケースでは、あなたの混乱は、4と3 3との差から茎4.あなたが期待するもので、C#が使用するものです。タミル語などの複雑なスクリプトでは、合字や発音区別記号が使用されます。合字は2つ以上の隣接する文字が1つのグリフに収縮したもので、あなたのケースではbulைは唇と房の結合で、後者は前者の外観を変えます。 דாもそのような合字です。発音区別符は、手紙の周りの装飾品である。 àの上のアクセント、または上のドット。
2つのケースでは、どちらも単一の文字として認識されますが、両方とも実際にはの文字が2つ必要です。だから、文字列の中に3つのコードポイントがある。
あなたのケースでは、2と3の区別は無関係ですが、一般的には留意してください。
+1、良い分析。 – Heinzi
ありがとうございます!これは私が探しているものです!あなたを愛してます! = X – Cheng