我有一个字符串,我想知道它内部是否有unicode字符。 (如果它完全包含ASCII或不包含ASCII)
我怎样才能做到这一点?
谢谢!
答案 0 :(得分:57)
如果我的假设是正确的,您希望知道您的字符串是否包含任何“非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。如果您只检测真正的ASCII字符范围(最多127个),那么您可能会获得不表示Unicode的扩展ASCII字符的误报。我在我的样本中提到了这一点。
答案 1 :(得分:11)
如果字符串仅包含ASCII字符,则使用ASCII编码的序列化+反序列化步骤应该返回相同的字符串 所以c#中的单行检查可能看起来像..
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
答案 2 :(得分:5)
ASCII
仅定义0-127
范围内的字符代码。明确定义Unicode
,例如在ASCII的相同范围内重叠。因此,如果查看字符串中的字符代码,并且它包含任何高于127的字符,则该字符串包含非ASCII字符的Unicode字符。
请注意,ASCII仅包含英文字母。因此,如果您(出于任何原因)需要将相同的方法应用于可能包含重音字符的字符串(例如西班牙语文本),则ASCII不够,您需要寻找另一个区别。
ANSI
字符集[*]确实使用128-255
范围内的上述重音拉丁字符扩展了ASCII字符。但是,Unicode在该范围内不与ANSI重叠,因此从技术上讲,Unicode字符串可能包含不属于ANSI的字符,但具有相同的字符代码(特别是在128-159
范围内,如您所见我链接到的表格。
至于执行此操作的实际代码,@ machib应答应该有效,尽管你应该修改它以涵盖严格的ASCII,因为它不适用于ANSI。
[*]也称为Latin 1 Windows(Win-1252)
答案 3 :(得分:1)
所有C#
/ VB.NET
string
数据类型都包含Unicode字符。
答案 4 :(得分:1)
只要它包含字符,它就包含Unicode字符。
将文本表示为一系列Unicode 字符。
public static bool ContainsUnicodeChars(string text)
{
return !string.IsNullOrEmpty(text);
}
您必须在以下情况下担心不同的Unicode编码:
一旦你进入字符串域,字符串最初用字符串表示的编码(如果有的话)是无关紧要的。
定义字符串中的每个字符 通过Unicode标量值,也称为 Unicode代码点或序号 Unicode的(数字)值 字符。 每个代码点都经过编码 通过使用UTF-16编码,和 每个元素的数值 编码由Char表示 对象
也许您可能也会发现这些问题相关:
How can you strip non-ASCII characters from a string? (in C#)
C# Ensure string contains only ASCII
Jon Skeet的这篇文章:Unicode and .NET
答案 5 :(得分:0)
这是另一种不使用lambda表达式的解决方案。它在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