স্ট্রিং তুলনায় উচ্চারণযুক্ত অক্ষর উপেক্ষা করা


141

আমার সি # তে 2 টি স্ট্রিং তুলনা করতে হবে এবং উচ্চারণযুক্ত অক্ষরগুলিকে অ-উচ্চারণযুক্ত অক্ষরের মতোই আচরণ করতে হবে। উদাহরণ স্বরূপ:

string s1 = "hello";
string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

এই 2 টি স্ট্রিং একই হওয়া দরকার (যতদূর আমার প্রয়োগ সম্পর্কিত) তবে এই বিবৃতি দুটিই মিথ্যা বলে মূল্যায়ন করে। এটি করার জন্য কি সি # তে কোনও উপায় আছে?

উত্তর:


251

সম্পাদনা 2012-01-20: ওহে ছেলে! সমাধানটি এত সহজ ছিল এবং প্রায় চিরকালের জন্য কাঠামোর মধ্যে ছিল। নাইটপফোর দ্বারা চিহ্নিত হিসাবে :

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);

এখানে একটি ফাংশন যা স্ট্রিং থেকে ডায়াক্রিটিক্সকে বাদ দেয়:

static string RemoveDiacritics(string text)
{
  string formD = text.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in formD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return sb.ToString().Normalize(NormalizationForm.FormC);
}

মিশচাপের ব্লগ ( আরআইপি ... ) এ আরও বিশদ ।

মূল নীতিটি হ'ল এটি 'é' কে ক্রমান্বয়ে 2 টি অক্ষরে পরিণত হয় ac এরপরে এটি চরিত্রগুলি দিয়ে পুনরাবৃত্তি করে এবং ডায়রাট্রিটিক্সকে এড়িয়ে যায়।

"হ্যালো" "সে <acute> ললো" হয়ে যায়, যা পরিবর্তে "হ্যালো" হয়ে যায়।

Debug.Assert("hello"==RemoveDiacritics("héllo"));

দ্রষ্টব্য: এখানে একই ফাংশনের আরও কমপ্যাক্ট .NET4 + বন্ধুত্বপূর্ণ সংস্করণ:

static string RemoveDiacritics(string text)
{
  return string.Concat( 
      text.Normalize(NormalizationForm.FormD)
      .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
                                    UnicodeCategory.NonSpacingMark)
    ).Normalize(NormalizationForm.FormC);
}

1
এটি না থাকার কারণে এটি নেট কোরটিতে কীভাবে করবেন string.Normalize?
আন্দ্রে সোয়ারস

এর জন্য ধন্যবাদ, আমি আশা করি আমি একাধিকবার উত্সাহ দিতে পারতাম! তবে এটি সমস্ত উচ্চারণকৃত অক্ষর হ্যান্ডেল করে না, উদাহরণস্বরূপ ð, ħ এবং ø যথাক্রমে o, h এবং o তে রূপান্তরিত হয় না। এগুলি পরিচালনা করার কোনও উপায় আছে কি?
অভ্রোহোম ইয়েস্রোয়েল

@ অ্যাভ্রোহোমইস্রোয়েল "ð" হ'ল "লাতিন ছোট চিঠি Eth", যা একটি পৃথক চিঠি, "ও-উইথ-অ্যাকসেন্ট" বা "ডি-সাথে-উচ্চারণ" নয়। অন্যটি হ'ল "লাতিন স্মার্ট লেটার এইচ উইথ স্ট্রোক" এবং "লাতিন স্মার্ট লেটার হে উইথ স্ট্রোক" যা পৃথক বর্ণ হিসাবেও বিবেচিত হতে পারে
হ্যানস কে st ইং

135

আপনার যদি স্ট্রিংটি রূপান্তর করতে না হয় এবং আপনি কেবল ব্যবহার করতে পারেন এমন সাম্যতা পরীক্ষা করতে চান

string s1 = "hello";
string s2 = "héllo";

if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace) == 0)
{
    // both strings are equal
}

অথবা আপনি যদি তুলনাটি কেস-সংবেদনশীলও হতে চান

string s1 = "HEllO";
string s2 = "héLLo";

if (String.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0)
{
    // both strings are equal
}

অন্য কেউ যদি এই IgnoreNonSpace বিকল্পটি সম্পর্কে আগ্রহী হন তবে আপনি এটি নিয়ে এই আলোচনাটি পড়তে চাইতে পারেন। pcreview.co.uk/forums/accent-insensitive-t3924592.html টিএলডিআর; এটা ঠিক আছে :)
জিম ডব্লিউ মনিকা

এমএসডিএন-তে: "ইউনিকোড স্ট্যান্ডার্ড অক্ষরগুলির সংমিশ্রণকে অক্ষর হিসাবে সংজ্ঞায়িত করে যা নতুন অক্ষর তৈরি করতে বেস অক্ষরগুলির সাথে একত্রিত হয়। ননস্প্যাকিং সংমিশ্রিত অক্ষর রেন্ডার করার সময় তারা নিজের দ্বারা কোনও ফাঁকা অবস্থান দখল করে না।"
এভলিন

ঠিক আছে এই পদ্ধতি এই 2 স্ট্রিং জন্য ব্যর্থ হয়েছে: tarafli / TARAFLİ তবে SQL সার্ভার সমান বলে যেমন হতে অনুমিত
MonsterMMORPG

2
এর কারণ এটি সাধারণত এসকিউএল সার্ভার কেস সংবেদনশীল হিসাবে কনফিগার করা হয় তবে ডি নেট ডিফল্ট তুলনাগুলি। নেট মধ্যে সংবেদনশীল হয়। এই ক্ষেত্রে কীভাবে সংবেদনশীল করা যায় তার উত্তর দেওয়ার জন্য আমি উত্তর আপডেট করেছি।
নাইটফফোর

আমি একটি আইকোয়ালিটি কম্পিউটার তৈরি করার চেষ্টা করছি। এটিতে গেটহ্যাশকোড সরবরাহ করা দরকার ... আপনি কীভাবে এটি পাবেন (এটি সমান হলে এটি একই হওয়া দরকার)
ইয়েপাইকাই

5

নিম্নলিখিত পদ্ধতিটি CompareIgnoreAccents(...)আপনার উদাহরণ ডেটাতে কাজ করে। এখানে নিবন্ধ যেখানে আমি আমার পটভূমি তথ্য পেয়েছিলাম হল: http://www.codeproject.com/KB/cs/EncodingAccents.aspx

private static bool CompareIgnoreAccents(string s1, string s2)
{
    return string.Compare(
        RemoveAccents(s1), RemoveAccents(s2), StringComparison.InvariantCultureIgnoreCase) == 0;
}

private static string RemoveAccents(string s)
{
    Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");

    return destEncoding.GetString(
        Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}

আমি মনে করি একটি এক্সটেনশন পদ্ধতি আরও ভাল হবে:

public static string RemoveAccents(this string s)
{
    Encoding destEncoding = Encoding.GetEncoding("iso-8859-8");

    return destEncoding.GetString(
        Encoding.Convert(Encoding.UTF8, destEncoding, Encoding.UTF8.GetBytes(s)));
}

তাহলে ব্যবহারটি এটি হবে:

if(string.Compare(s1.RemoveAccents(), s2.RemoveAccents(), true) == 0) {
   ...

1
এটি 'তে উচ্চারণের চিঠি তৈরি করে?'
onmyway133

4
এটি একটি ধ্বংসাত্মক তুলনা, যেখানে উদাহরণস্বরূপ ā এবং ē সমান হিসাবে বিবেচিত হবে। আপনি 0xFF এর উপরে কোনও অক্ষর আলগা করে দিয়েছেন এবং স্ট্রিংগুলি সমান-উপেক্ষা-অ্যাকসেন্টের কোনও গ্যারান্টি নেই
হাবিল

আপনি lose এর মতো জিনিসও হারাবেন ñ আমাকে জিজ্ঞাসা করলে সমাধান নয়।
ইগনাসিও সোলার গার্সিয়া

5

আমাকে অনুরূপ কিছু করতে হয়েছিল তবে স্টার্টসইথ পদ্ধতি সহ। @ সার্জ - অ্যাপ ট্রান্সলেটর থেকে প্রাপ্ত একটি সাধারণ সমাধান এখানে।

এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে:

    public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
    {
        if (str.Length >= value.Length)
            return string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
        else
            return false;            
    }

এবং একটি লাইনার freaks জন্য;)

    public static bool StartsWith(this string str, string value, CultureInfo culture, CompareOptions options)
    {
        return str.Length >= value.Length && string.Compare(str.Substring(0, value.Length), value, culture, options) == 0;
    }

অ্যাকসেন্ট ইনসেনসিটিভ এবং কেস ইনসেনসিটিভ স্টার্টস এর সাথে এটি বলা যেতে পারে

value.ToString().StartsWith(str, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)


-3

স্ট্রিংয়ে এই ওভারলোডটি ব্যবহার করে দেখুন omp

স্ট্রিং.কম্পার পদ্ধতি (স্ট্রিং, স্ট্রিং, বুলিয়ান, কালচারআইনফো)

এটি কালচারিনফোর সহ তুলনামূলক ক্রিয়াকলাপগুলির ভিত্তিতে একটি ইনট মান সরবরাহ করে value পৃষ্ঠার উদাহরণটি এন-ইউএস এবং এন-সিজেডে "পরিবর্তন" এর সাথে তুলনা করে। এন-সিজেডে সিএইচ একটি একক "চিঠি"।

লিঙ্ক থেকে উদাহরণ

using System;
using System.Globalization;

class Sample {
    public static void Main() {
    String str1 = "change";
    String str2 = "dollar";
    String relation = null;

    relation = symbol( String.Compare(str1, str2, false, new CultureInfo("en-US")) );
    Console.WriteLine("For en-US: {0} {1} {2}", str1, relation, str2);

    relation = symbol( String.Compare(str1, str2, false, new CultureInfo("cs-CZ")) );
    Console.WriteLine("For cs-CZ: {0} {1} {2}", str1, relation, str2);
    }

    private static String symbol(int r) {
    String s = "=";
    if      (r < 0) s = "<";
    else if (r > 0) s = ">";
    return s;
    }
}
/*
This example produces the following results.
For en-US: change < dollar
For cs-CZ: change > dollar
*/

উচ্চারণকৃত ভাষার জন্য আপনার সংস্কৃতি পেতে হবে এবং তার ভিত্তিতে স্ট্রিংগুলি পরীক্ষা করতে হবে।

http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx


এটি সরাসরি স্ট্রিংগুলির সাথে তুলনা করার চেয়ে ভাল পন্থা, তবে এটি এখনও বেস লেটার এবং এর উচ্চারণকৃত সংস্করণটিকে আলাদা বলে বিবেচনা করে । সুতরাং এটি মূল প্রশ্নের উত্তর দেয় না, যা উচ্চারণগুলিকে উপেক্ষা করতে চেয়েছিল।
সিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.