文字列があり、その中にユニコード文字があるかどうかを知りたいです。 (ASCIIかどうか)が完全に含まれている場合)
どうすればそれを達成できますか?
ありがとう!
私の仮定が正しい場合は、文字列に「非ANSI」文字が含まれているかどうかを知りたいと思います。これは次のように導出できます。
public void test()
{
const string WithUnicodeCharacter = "a hebrew character:\uFB2F";
const string WithoutUnicodeCharacter = "an ANSI character:Æ";
bool hasUnicode;
//true
hasUnicode = ContainsUnicodeCharacter(WithUnicodeCharacter);
Console.WriteLine(hasUnicode);
//false
hasUnicode = ContainsUnicodeCharacter(WithoutUnicodeCharacter);
Console.WriteLine(hasUnicode);
}
public bool ContainsUnicodeCharacter(string input)
{
const int MaxAnsiCode = 255;
return input.Any(c => c > MaxAnsiCode);
}
更新
これにより、拡張ASCIIが検出されます。 true ASCII文字範囲(127まで)のみを検出した場合、Unicodeを示さない拡張ASCII文字に対して偽陽性が発生する可能性があります。 。サンプルでこれをほのめかしています。
文字列にASCII文字のみが含まれる場合、ASCIIエンコーディングを使用したシリアライゼーション+デシリアライゼーションステップは同じ文字列を返すので、c#の1つのライナーチェックは次のようになります。 ..
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
ASCII
は、0-127
の範囲の文字コードのみを定義します。 Unicode
は、ASCIIと同じ範囲で重複するように明示的に定義されます。したがって、文字列内の文字コードを見て、127を超えるものが含まれている場合、文字列にはASCII文字以外のUnicode文字が含まれます。
ASCIIには英語のアルファベットのみが含まれることに注意してください。したがって、(何らかの理由で)アクセント付き文字(たとえば、スペイン語のテキスト)を含む可能性のある文字列に同じアプローチを適用する必要がある場合、ASCIIでは不十分で、別の差別化要因を探す必要があります。
ANSI
文字セット[*]は、ASCII文字を、前述のアクセント付きラテン文字128-255
の範囲で拡張します。ただし、Unicodeはその範囲でANSIと重複しないため、技術的にはUnicode文字列にはANSIの一部ではないが同じ文字コード(具体的には128-159
の範囲の文字)が含まれる場合があります私がリンクしたテーブル)。
これを行う実際のコードについては、@ chibacityの回答が機能するはずですが、ANSIでは機能しないため、厳密なASCIIをカバーするように修正する必要があります。
[*] Latin 1 Windows(Win-1252)とも呼ばれます
すべて C#
/VB.NET
string
データ型はUnicode文字で構成されています。
文字を含む限り、Unicode文字を含みます。
から System.String
:
テキストを一連のUnicode文字として表します。
public static bool ContainsUnicodeChars(string text)
{
return !string.IsNullOrEmpty(text);
}
通常、次のことを行う必要がある場合、異なるUnicodeエンコードについて心配する必要があります。
しかし、いったん文字列の土地に入ったら、文字列が元々表現されていたエンコーディングは、もしあれば、無関係です。
文字列内の各文字は、UnicodeコードポイントまたはUnicode文字の序数(数値)値とも呼ばれるUnicodeスカラー値によって定義されます。 各コードポイントはUTF-16エンコードを使用してエンコードされます。エンコードの各要素の数値はCharオブジェクトで表されます。
おそらくこれらの質問も関連しているかもしれません:
文字列から非ASCII文字を削除するにはどうすればよいですか?(C#で)
Jon Skeetによるこの記事: nicode and .NET
これは、ラムダ式を使用しない別のソリューションです。 VB.NETにありますが、C#に簡単に変換できます。
Public Function ContainsUnicode(ByVal inputstr As String) As Boolean
Dim inputCharArray() As Char = inputstr.ToCharArray
For i As Integer = 0 To inputCharArray.Length - 1
If CInt(AscW(inputCharArray(i))) > 255 Then Return True
Next
Return False
End Function