web-dev-qa-db-ja.com

文字列にUnicode文字が含まれているかどうかを認識する方法は?

文字列があり、その中にユニコード文字があるかどうかを知りたいです。 (ASCIIかどうか)が完全に含まれている場合)

どうすればそれを達成できますか?

ありがとう!

33
Himberjack

私の仮定が正しい場合は、文字列に「非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文字に対して偽陽性が発生する可能性があります。 。サンプルでこれをほのめかしています。

60
Tim Lloyd

文字列にASCII文字のみが含まれる場合、ASCIIエンコーディングを使用したシリアライゼーション+デシリアライゼーションステップは同じ文字列を返すので、c#の1つのライナーチェックは次のようになります。 ..

String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
11
zingh

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)とも呼ばれます

5
Franci Penov

すべて C#/VB.NETstring データ型はUnicode文字で構成されています。

1
Mitch Wheat

文字を含む限り、Unicode文字を含みます。

から System.String

テキストを一連のUnicode文字として表します。

public static bool ContainsUnicodeChars(string text)
{
   return !string.IsNullOrEmpty(text);
}

通常、次のことを行う必要がある場合、異なるUnicodeエンコードについて心配する必要があります。

  1. Encode文字列into特定のエンコーディングのバイトストリーム。
  2. Decode文字列from特定のエンコーディングのバイトストリーム。

しかし、いったん文字列の土地に入ったら、文字列が元々表現されていたエンコーディングは、もしあれば、無関係です。

文字列内の各文字は、UnicodeコードポイントまたはUnicode文字の序数(数値)値とも呼ばれるUnicodeスカラー値によって定義されます。 各コードポイントはUTF-16エンコードを使用してエンコードされます。エンコードの各要素の数値はCharオブジェクトで表されます。

おそらくこれらの質問も関連しているかもしれません:

文字列から非ASCII文字を削除するにはどうすればよいですか?(C#で)

C#文字列にASCIIのみが含まれることを確認

Jon Skeetによるこの記事: nicode and .NET

1
Ani

これは、ラムダ式を使用しない別のソリューションです。 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
0