C# 如何识别字符串是否包含unicode字符?
我有一个字符串,我想知道里面是否有unicode字符。 (如果其完全包含ASCII或不包含ASCII) 我怎样才能做到这一点 谢谢 只要它包含字符,它就包含Unicode字符 发件人: 将文本表示为一系列Unicode字符 人物 当您必须执行以下操作时,通常需要考虑不同的Unicode编码:C# 如何识别字符串是否包含unicode字符?,c#,asp.net,unicode,C#,Asp.net,Unicode,我有一个字符串,我想知道里面是否有unicode字符。 (如果其完全包含ASCII或不包含ASCII) 我怎样才能做到这一点 谢谢 只要它包含字符,它就包含Unicode字符 发件人: 将文本表示为一系列Unicode字符 人物 当您必须执行以下操作时,通常需要考虑不同的Unicode编码: 使用特定编码将字符串编码为字节流 从具有特定编码的字节流中解码字符串 但一旦进入字符串区域,字符串最初使用的编码(如果有的话)就无关紧要了 字符串中的每个字符都已定义 通过Unicode标量值,也称为 Un
Jon Skeet的这篇文章:如果我的假设是正确的,您希望知道您的字符串是否包含任何“非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字符产生误报。我在示例中已经提到了这一点。仅定义范围0-127
内的字符代码Unicode
被明确定义为与ASCII在同一范围内重叠。因此,如果您查看字符串中的字符代码,并且它包含高于127的任何内容,则该字符串包含非ASCII字符的Unicode字符
请注意,ASCII仅包括英文字母表。因此,如果您(出于任何原因)需要对可能包含重音字符(例如西班牙语文本)的字符串应用相同的方法,ASCII是不够的,您需要寻找另一个区别点
字符集[*]使用上述重音拉丁字符扩展ASCII字符,范围为128-255
。但是,Unicode在该范围内不与ANSI重叠,因此从技术上讲,Unicode字符串可能包含不属于ANSI的字符,但具有相同的字符代码(特别是在范围128-159
,如我链接到的表所示)
至于实现这一点的实际代码,@chibacity answer应该可以工作,尽管您应该修改它以覆盖严格的ASCII,因为它不适用于ANSI
[*]也称为拉丁1窗口(Win-1252)这是另一个不使用lambda表达式的解决方案。它在VB.NET中,但您可以轻松地将其转换为C#:
如果字符串仅包含ASCII字符,则使用ASCII编码的序列化+反序列化步骤应返回相同的字符串 所以在c#的一行检查可能看起来像
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;
我认为您需要告诉我们更多,因为.NET中的所有字符串都是unicode。您是否担心在编码过程中会丢失一些字符?如果是这样,请告诉我们你打算用这些知识做什么。我想知道一些东西是否符合ASCII。。。(完全遵守)使用正则表达式-这将是一个相关问题,正则表达式可用于替换或匹配。下面的答案是关于替换的,但是您可以使用正则表达式来匹配,因为Unicode是ASCII的超集。问题显然是如何确定字符串是否只使用ASCII字符。所以这个答案对我来说似乎不必要的迂腐…@Zero3:对这个问题的编辑是在我的答案之后进行的。ASCII中只有128个字符,因此,
>255
似乎不正确。有256个字符,包括基于此表的扩展ascii字符代码。它不适用于俄语测试:System.Text.asciencoding.GetEncoding(0).GetString(System.Text.asciencoding.GetEncoding(0).GetBytes(“фƏ”)!=“фы”
返回False。我在控制台应用程序中测试了您的精确语句,它为我返回True。我在linqPad中测试了这一点-它返回False。这是不正确的。C字符是unicode UTF-16字符。只有127个字符与ASCII中的字符相同。ASCII扩展范围将根据所使用的语言环境而有所不同,即ANSI非扩展ASCII。因此,对于英语ISO-8859-1,字符将与UTF-16匹配,但在其他语言环境中它们将不相同。请参见此处的比较表:。
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
String s1="testभारत";
bool isUnicode= System.Text.ASCIIEncoding.GetEncoding(0).GetString(System.Text.ASCIIEncoding.GetEncoding(0).GetBytes(s1)) != s1;