【问题标题】:how to check if a string contains diacritic and keep the diacritic [duplicate]如何检查字符串是否包含变音符号并保留变音符号[重复]
【发布时间】:2021-02-18 08:03:50
【问题描述】:

我需要检查一个字符串是否包含变音符号,所以如果我有一个名字“Kateřina”,我需要返回 true,如果我有“Jana”,我需要返回 false。对于这两个值,我现在都得到了错误。请我不想删除它们我想保留它们所以字符串规范化不会做,基本上我需要检查字符串是否有这些ěščřžýáíé

static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            string name = "Jana";

            string name2 = "Kateřina";

            if (ExTest.DiacriticCheck(name))
            {
                Console.WriteLine(name);
            }
            if (ExTest.DiacriticCheck(name2))
            {
                Console.WriteLine(name2);
            }

        } 

public static bool DiacriticCheck(string text)
            {
                if (Regex.IsMatch(text, @"^[\p{L}\p{N}\p{Zs}_-]+$ˇ") == false)
                {
                     return false;
                }
           
                return true;
            }

【问题讨论】:

标签: c# regex


【解决方案1】:
public static bool DiacriticCheck(string text) => Regex.IsMatch(text, @"[ěščřžýáíé]");

【讨论】:

    【解决方案2】:

    很遗憾,变音符号只能手动查找和替换。没有金旗告诉你这是一个变音符号

    您所能做的就是在不同的编码之间进行转换并比较输出的字符串,或者在某个地方放置一个带有变音符号的大表(或直接使用所需替换的字典)。

    例如,Diacritics.Net 项目只拥有这样一个字典(或每种语言的一堆)并检查是否存在字符。

    或者您可以自己创建这样的字典。一个好的起点也可以是this code

    【讨论】:

    • 正如我所说我不希望它被替换,我看过 Diacritics.Net 但它似乎不适用于 Xamarin.forms
    • 这个项目中的映射器还有一个方法bool HasDiacritics(string source)(它在内部只是运行Remove()并将输出的字符串与输入进行比较)。
    • 如果此项目不适用于 Xamarin.forms,那么这是一个不同的问题。但是我查看了项目的代码,它只使用了自 .Net 3.5 以来可用的基本内容,所以它应该在 Xamarin 中工作(但我不知道)。
    【解决方案3】:

    您可以检查字符串IsNormalized()

    实现此目的的另一种简单方法是将文本转换为仅包含非变音符号字符的 ASCII 7 位,然后将其与原始值进行比较。 这可能会有所帮助,因为您稍后在程序中实际上只需要 ASCII 字符。

    以下代码中,注释部分为ASCII方式:

        static bool DiacriticCheck(string text)
        {
            //byte[] bytes = Encoding.UTF8.GetBytes(text);
            //string textAscii = Encoding.ASCII.GetString(bytes);
            //return text != textAscii;
            return !text.IsNormalized(NormalizationForm.FormD);
        }
    

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2016-06-26
      • 2012-12-20
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多