আমি নেট থেকে স্ট্রিং থেকে ডায়াক্রিটিক্স (অ্যাকসেন্টস) কীভাবে সরিয়ে ফেলব?


433

আমি ফরাসী কানাডিয়ান ভাষায় থাকা কয়েকটি স্ট্রিং রূপান্তরিত করার চেষ্টা করছি এবং মূলত, আমি চিঠিটি রাখার সময় অক্ষরে ফরাসি উচ্চারণের চিহ্নগুলি বের করতে সক্ষম হতে চাই like (যেমন ধর্মান্তরিত éকরার e, তাই crème brûléeহয়ে যাবে creme brulee)

এটি অর্জনের জন্য সর্বোত্তম পদ্ধতি কী?


14
একটি সতর্কতা: এই পদ্ধতিটি কিছু নির্দিষ্ট ক্ষেত্রে কার্যকর হতে পারে তবে সাধারণভাবে আপনি কেবল ডায়াক্রিটিকাল চিহ্নগুলি সরাতে পারবেন না। কিছু ক্ষেত্রে এবং কিছু ভাষায় এটি পাঠ্যের অর্থ পরিবর্তন করতে পারে। আপনি কেন এটি করতে চান তা বলবেন না; যদি এটি স্ট্রিংগুলির তুলনা বা অনুসন্ধানের স্বার্থে হয় তবে আপনি সম্ভবত এটির জন্য একটি ইউনিকোড-সচেতন লাইব্রেরি ব্যবহার করে ভাল better
জ্যাকবিবি

1
যেহেতু বেশিরভাগ কৌশল অর্জনের কৌশলগুলি ইউনিকোড নরমালাইজেশনের উপর নির্ভর করে, স্ট্যান্ডার্ড বর্ণনা করা এই দস্তাবেজটি পড়তে কার্যকর হতে পারে: ইউনিকোড.অর্গ
টিআর

আমি মনে করি যে আজুর দল এই সমস্যাটি সমাধান করেছে, আমি "মোমো দে লা রুনিয়ুন.পিডিএফ" নামের সাথে একটি ফাইল আপলোড করার চেষ্টা করেছি এবং অপারেশনটি সফল হয়েছিল।
রেডি

উত্তর:


531

আমি এই পদ্ধতিটি ব্যবহার করি নি, তবে মাইকেল ক্যাপলান তার ব্লগ পোস্টে (একটি বিভ্রান্তিকর শিরোনাম সহ) এটি করার জন্য একটি পদ্ধতি বর্ণনা করেছেন যা ডায়রিটিক্সকে বাদ দেওয়া সম্পর্কে কথা বলেছে: স্ট্রাইপিং একটি আকর্ষণীয় কাজ (ওরফে অর্থহীন, ওরফে সমস্ত এমএন চরিত্রের অর্থ) ব্যবধানহীন, তবে কিছু অন্যদের চেয়ে বেশি ব্যবধানযুক্ত)

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder();

    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

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

মনে রাখবেন এটি তার আগের পোস্টের ফলোআপ: স্ট্রিপিং ডায়াক্রিটিক্স ....

পদ্ধতির স্ট্রিং ব্যবহার করে। ইনপুট স্ট্রিংটিকে উপাদান গ্লাইফগুলিতে বিভক্ত করতে (মূলত "বেস" অক্ষরগুলি ডায়াক্রিটিক্স থেকে পৃথক করে) এবং তারপরে ফলাফলটি স্ক্যান করে কেবলমাত্র বেস অক্ষরগুলি ধরে রাখে। এটি কিছুটা জটিল, তবে সত্যিই আপনি একটি জটিল সমস্যার দিকে তাকাচ্ছেন।

অবশ্যই, যদি আপনি নিজেকে ফরাসী ভাষায় সীমাবদ্ধ রাখেন তবে আপনি সম্ভবত ডেভিড ডিবেনের পরামর্শ অনুসারে, সি ++ স্টেড :: স্ট্রিংয়ে কীভাবে অ্যাকসেন্ট এবং টিলড সরিয়ে ফেলতে পারবেন তার সহজ টেবিল-ভিত্তিক পদ্ধতির সাথে আপনি পালিয়ে যেতে পারেন


32
এটা ভুল. জার্মান অক্ষর A এবং o এবং গফ দেননি AE ue এবং OE যেমন, এবং একটি নয়, OU ...
স্টিফান Steiger

20
এছাড়াও, পোলিশ বর্ণ ł উপেক্ষা করা হয়।
Zbigniew Wiadro

4
এছাড়াও নর্স ignored উপেক্ষা করা হয়েছে
রিচার্ড ডি উইট

28
@ স্টেফানস্টেইগার আপনি জানেন, চেকে áčěů এর মতো অক্ষর রয়েছে, যা আমরা সাধারণত "এসিডে" লাটিনাইজ করি "যদিও এটি ভিন্ন লাগে এবং এটি" হ্রবি "/ হেরা: বিজে /," হরবা "/ হারবজে / এর মতো শব্দগুলিতে বিভ্রান্তি সৃষ্টি করতে পারে, এবং "হারাবে" / হারব /। আমার কাছে মনে হয় ডায়াক্রিটিক্স মুছে ফেলা একটি গ্রাফিক্যাল বিষয়, চিঠির স্বরবিজ্ঞান বা ইতিহাসের প্রতি আগ্রহহীন। Letters ö like এর মতো অক্ষরগুলি বেস বর্ণগুলিতে একটি সুপারস্ক্রিপ্ট "ই" যুক্ত করে তৈরি করা হয়েছিল, এভাবে "এই" পচনটি historতিহাসিকভাবে বোঝা যায়। এটি লক্ষ্যটির উপর নির্ভর করে - গ্রাফিকাল চিহ্নগুলি সরিয়ে ফেলতে, বা চিঠিটি ASCII অক্ষরগুলিকে পচন করতে।
ইলিডানএস 4 মনোকিকে

10
এই ফাংশনটি ভাষা-অজ্ঞাতনামা। এটি স্ট্রিং জার্মান বা অন্য কোনও ভাষায় আছে কিনা তা জানে না। যদি আমরা বিবেচনা করি যে এটি একটি জার্মান লেখায় o এর পরিবর্তে ঠিক আছে, তবে তুর্কি ভাষায় এটি করার কোনও মানে হয় না, তবে আমরা দেখতে পাব যে ভাষাটি সনাক্ত না করেই এই সমস্যাটি আসলে সমাধানযোগ্য নয়।
কাঁটা̈

163

এটি আমার জন্য কৌশলটি করেছে ...

string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);

দ্রুত ও সংক্ষিপ্ত!


9
এটি আমার দেখা সেরা পদ্ধতি।
ক্লিটন

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

2
এটি বেশিরভাগ সাধারণ চরিত্রের জন্য কাজ করবে, তবে অনেকগুলি বিশেষ চরিত্র « »এবং (একক চরিত্র হিসাবে) প্রক্রিয়ায় পরিবর্তিত হবে যা গ্রহণযোগ্য সমাধানের ক্ষেত্রে নয়।
The_Black_Smurf

7
নোট করুন যে এটি লিনাক্সের .NET System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
কোরটিতে

2
যদি আপনি .NET কোর System.Text.Encoding.CodePagesচালু থাকেন তবে নুগেট থেকে ইনস্টল করুন , তারপরে সরবরাহকারীকে রেজিস্ট্রেশন করতে এই কল করুন: Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);- একবার আপনি এটি সম্পন্ন করার পরে, আইএসও -8859-8
স্পেসবিসন

32

যদি কেউ আগ্রহী হয় তবে আমি অনুরূপ কিছু সন্ধান করছি এবং নিম্নলিখিতটি লেখা শেষ করলাম:

public static string NormalizeStringForUrl(string name)
{
    String normalizedString = name.Normalize(NormalizationForm.FormD);
    StringBuilder stringBuilder = new StringBuilder();

    foreach (char c in normalizedString)
    {
        switch (CharUnicodeInfo.GetUnicodeCategory(c))
        {
            case UnicodeCategory.LowercaseLetter:
            case UnicodeCategory.UppercaseLetter:
            case UnicodeCategory.DecimalDigitNumber:
                stringBuilder.Append(c);
                break;
            case UnicodeCategory.SpaceSeparator:
            case UnicodeCategory.ConnectorPunctuation:
            case UnicodeCategory.DashPunctuation:
                stringBuilder.Append('_');
                break;
        }
    }
    string result = stringBuilder.ToString();
    return String.Join("_", result.Split(new char[] { '_' }
        , StringSplitOptions.RemoveEmptyEntries)); // remove duplicate underscores
}

9
আপনার নামটিতে স্ট্রিং বিল্ডার বাফারটি প্রিলোকলেট করা উচিত memory মেমরি বরাদ্দকে ওভারহেড হ্রাস করতে দৈর্ঘ্য। সিক্যুয়াল ডুপ্লিকেট _ অপসারণের জন্য এটি শেষ বিভক্ত / যোগদানের কলটি আকর্ষণীয়। সম্ভবত আমাদের কেবল এগুলিকে লুপে এড়ানো উচিত। পূর্ববর্তী অক্ষরটির জন্য একটি পতাকা নির্ধারণ করুন _ এবং সত্য হিসাবে যদি এটি নির্গত হয় না।
শে

2 সত্যিই ভাল পয়েন্ট, আমি যদি কোডের এই অংশে ফিরে যাওয়ার সময় পাই তবে আমি এটি আবার
লিখব

খুশী হলাম। আইডিস্পোজেবলস মন্তব্য ছাড়াও, আমাদের c < 128কোনও ইউটিএফ অক্ষর বাছাই না করার জন্য আমাদের সম্ভবত এটি পরীক্ষা করা উচিত , এখানে দেখুন
ক্রিশ্চিয়ান গোলহার্ড্ট

1
বা সম্ভবত আরও দক্ষতার সাথে c < 123এএসসিআই দেখুন
খ্রিস্টান গোলহার্ট

এখনও :
জুনিয়র

27

আমার এমন কিছু দরকার ছিল যা সমস্ত বড় ইউনিকোড চরিত্রগুলিকে রূপান্তরিত করে এবং ভোট দেওয়া উত্তরটি কিছুটা ফাঁকা হয়ে যায় তাই আমি কোডইগিনিটারের একটি সংস্করণ convert_accented_characters($str)সি # তে তৈরি করেছি যা সহজেই অনুকূলিতযোগ্য:

using System;
using System.Text;
using System.Collections.Generic;

public static class Strings
{
    static Dictionary<string, string> foreign_characters = new Dictionary<string, string>
    {
        { "äæǽ", "ae" },
        { "öœ", "oe" },
        { "ü", "ue" },
        { "Ä", "Ae" },
        { "Ü", "Ue" },
        { "Ö", "Oe" },
        { "ÀÁÂÃÄÅǺĀĂĄǍΑΆẢẠẦẪẨẬẰẮẴẲẶА", "A" },
        { "àáâãåǻāăąǎªαάảạầấẫẩậằắẵẳặа", "a" },
        { "Б", "B" },
        { "б", "b" },
        { "ÇĆĈĊČ", "C" },
        { "çćĉċč", "c" },
        { "Д", "D" },
        { "д", "d" },
        { "ÐĎĐΔ", "Dj" },
        { "ðďđδ", "dj" },
        { "ÈÉÊËĒĔĖĘĚΕΈẼẺẸỀẾỄỂỆЕЭ", "E" },
        { "èéêëēĕėęěέεẽẻẹềếễểệеэ", "e" },
        { "Ф", "F" },
        { "ф", "f" },
        { "ĜĞĠĢΓГҐ", "G" },
        { "ĝğġģγгґ", "g" },
        { "ĤĦ", "H" },
        { "ĥħ", "h" },
        { "ÌÍÎÏĨĪĬǏĮİΗΉΊΙΪỈỊИЫ", "I" },
        { "ìíîïĩīĭǐįıηήίιϊỉịиыї", "i" },
        { "Ĵ", "J" },
        { "ĵ", "j" },
        { "ĶΚК", "K" },
        { "ķκк", "k" },
        { "ĹĻĽĿŁΛЛ", "L" },
        { "ĺļľŀłλл", "l" },
        { "М", "M" },
        { "м", "m" },
        { "ÑŃŅŇΝН", "N" },
        { "ñńņňʼnνн", "n" },
        { "ÒÓÔÕŌŎǑŐƠØǾΟΌΩΏỎỌỒỐỖỔỘỜỚỠỞỢО", "O" },
        { "òóôõōŏǒőơøǿºοόωώỏọồốỗổộờớỡởợо", "o" },
        { "П", "P" },
        { "п", "p" },
        { "ŔŖŘΡР", "R" },
        { "ŕŗřρр", "r" },
        { "ŚŜŞȘŠΣС", "S" },
        { "śŝşșšſσςс", "s" },
        { "ȚŢŤŦτТ", "T" },
        { "țţťŧт", "t" },
        { "ÙÚÛŨŪŬŮŰŲƯǓǕǗǙǛŨỦỤỪỨỮỬỰУ", "U" },
        { "ùúûũūŭůűųưǔǖǘǚǜυύϋủụừứữửựу", "u" },
        { "ÝŸŶΥΎΫỲỸỶỴЙ", "Y" },
        { "ýÿŷỳỹỷỵй", "y" },
        { "В", "V" },
        { "в", "v" },
        { "Ŵ", "W" },
        { "ŵ", "w" },
        { "ŹŻŽΖЗ", "Z" },
        { "źżžζз", "z" },
        { "ÆǼ", "AE" },
        { "ß", "ss" },
        { "IJ", "IJ" },
        { "ij", "ij" },
        { "Œ", "OE" },
        { "ƒ", "f" },
        { "ξ", "ks" },
        { "π", "p" },
        { "β", "v" },
        { "μ", "m" },
        { "ψ", "ps" },
        { "Ё", "Yo" },
        { "ё", "yo" },
        { "Є", "Ye" },
        { "є", "ye" },
        { "Ї", "Yi" },
        { "Ж", "Zh" },
        { "ж", "zh" },
        { "Х", "Kh" },
        { "х", "kh" },
        { "Ц", "Ts" },
        { "ц", "ts" },
        { "Ч", "Ch" },
        { "ч", "ch" },
        { "Ш", "Sh" },
        { "ш", "sh" },
        { "Щ", "Shch" },
        { "щ", "shch" },
        { "ЪъЬь", "" },
        { "Ю", "Yu" },
        { "ю", "yu" },
        { "Я", "Ya" },
        { "я", "ya" },
    };

    public static char RemoveDiacritics(this char c){
        foreach(KeyValuePair<string, string> entry in foreign_characters)
        {
            if(entry.Key.IndexOf (c) != -1)
            {
                return entry.Value[0];
            }
        }
        return c;
    }

    public static string RemoveDiacritics(this string s) 
    {
        //StringBuilder sb = new StringBuilder ();
        string text = "";


        foreach (char c in s)
        {
            int len = text.Length;

            foreach(KeyValuePair<string, string> entry in foreign_characters)
            {
                if(entry.Key.IndexOf (c) != -1)
                {
                    text += entry.Value;
                    break;
                }
            }

            if (len == text.Length) {
                text += c;  
            }
        }
        return text;
    }
}

ব্যবহার

// for strings
"crème brûlée".RemoveDiacritics (); // creme brulee

// for chars
"Ã"[0].RemoveDiacritics (); // A

5
আপনার বাস্তবায়ন কাজটি করে তবে প্রডাকশন কোড ব্যবহার করার আগে উন্নত করা উচিত।
পিয়েরে


কেন কেবল এই প্রতিস্থাপন না if (entry.Key.IndexOf(c) != -1)মধ্যেif (entry.Key.Contains(c))
Pawel Cioch

কেন লুপে সরানডায়াক্রিটিক্স (চর সি) পুনরায় ব্যবহার করবেন না, স্ট্রিংবিল্ডার কেন ব্যবহার করবেন না। আমি জটিল অভিধান এবং কার্যক্ষম সমাধানের জন্য
উত্সাহ দিয়েছি

1
আমি বুঝতে পারছি না কেন কেবল কল করার { "äæǽ", "ae" }পরিবর্তে এত হুপ জাম্পিং রয়েছে । অভিধানের ইতিমধ্যে যে সূচকের উদ্দেশ্য রয়েছে তা আপনি সম্পূর্ণরূপে পরাজিত করেছেন। { "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }if (foreign_characters.TryGetValue(...)) ...
বেকন বিটস

15

কারও আগ্রহী হলে জাভা সমতুল্য:

import java.text.Normalizer;

public class MyClass
{
    public static String removeDiacritics(String input)
    {
        String nrml = Normalizer.normalize(input, Normalizer.Form.NFD);
        StringBuilder stripped = new StringBuilder();
        for (int i=0;i<nrml.length();++i)
        {
            if (Character.getType(nrml.charAt(i)) != Character.NON_SPACING_MARK)
            {
                stripped.append(nrml.charAt(i));
            }
        }
        return stripped.toString();
    }
}

3
স্ট্রিপড + + nrML.charAt এর পরিবর্তে (i) একটি স্ট্রিংবিল্ডার ব্যবহার করুন। আপনার এখানে ও (রান) রানটাইম লুকানো আছে।
আন্দ্রেয় পিটারসন

6
এই এবং এখানে অন্যান্য জাভা উত্তরগুলি কেবল এই থ্রেডকে গোলমাল করছে। প্রশ্নটি সি # (। নেট) সম্পর্কে জাভা নয়!
suchoss

15

আমি প্রায়শই এখানে পাওয়া অন্য সংস্করণের উপর ভিত্তি করে একটি এক্সটেনশন পদ্ধতি ব্যবহার করি ( সি # তে অক্ষরগুলি প্রতিস্থাপন (অ্যাসিআই) দেখুন ) একটি দ্রুত ব্যাখ্যা:

  • ডি স্প্লিট বৈশিষ্ট্যগুলি গঠনের জন্য সাধারণকরণ è যেমন একটি এবং একটি ননস্পেসিং `
  • এটি থেকে, নোস্প্যাকিং অক্ষরগুলি সরানো হবে
  • ফলাফলটি সি তৈরির দিকে ফিরে স্বাভাবিক করা হয়েছে (আমি নিশ্চিত নই যে এটি নেকসেসারি কিনা)

কোড:

using System.Linq;
using System.Text;
using System.Globalization;

// namespace here
public static class Utility
{
    public static string RemoveDiacritics(this string str)
    {
        if (null == str) return null;
        var chars =
            from c in str.Normalize(NormalizationForm.FormD).ToCharArray()
            let uc = CharUnicodeInfo.GetUnicodeCategory(c)
            where uc != UnicodeCategory.NonSpacingMark
            select c;

        var cleanStr = new string(chars.ToArray()).Normalize(NormalizationForm.FormC);

        return cleanStr;
    }

    // or, alternatively
    public static string RemoveDiacritics2(this string str)
    {
        if (null == str) return null;
        var chars = str
            .Normalize(NormalizationForm.FormD)
            .ToCharArray()
            .Where(c=> CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
            .ToArray();

        return new string(chars).Normalize(NormalizationForm.FormC);
    }
}

9

কোডপেজ অফ গ্রীক (আইএসও) এটি করতে পারে

এই কোডপেজ সম্পর্কে তথ্য System.Text.Encoding.GetEncodings()। এ সম্পর্কে শিখুন: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspx

গ্রীক (আইএসও) এর কোডপেজ আছে 28597 এবং নাম ইসো -8859-7

কোডে যান ... \ o /

string text = "Você está numa situação lamentável";

string textEncode = System.Web.HttpUtility.UrlEncode(text, Encoding.GetEncoding("iso-8859-7"));
//result: "Voce+esta+numa+situacao+lamentavel"

string textDecode = System.Web.HttpUtility.UrlDecode(textEncode);
//result: "Voce esta numa situacao lamentavel"

সুতরাং, এই ফাংশনটি লিখুন ...

public string RemoveAcentuation(string text)
{
    return
        System.Web.HttpUtility.UrlDecode(
            System.Web.HttpUtility.UrlEncode(
                text, Encoding.GetEncoding("iso-8859-7")));
}

মনে রাখবেন ... Encoding.GetEncoding("iso-8859-7")এর সমতুল্য Encoding.GetEncoding(28597)কারণ প্রথমটির নাম, এবং দ্বিতীয়টি এনকোডিংয়ের কোডপেজ।


3
উজ্জ্বল! সংক্ষিপ্ত এবং দক্ষ!
krlzlx

1
দুর্দান্ত জিনিস। আমি পরীক্ষিত প্রায় কোনও চরিত্রই পাস করেছে। ( äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı)। সমস্যাগুলি কেবল তার সাথেই পাওয়া গেছে ßə, যা রূপান্তরিত হয় ?তবে এই জাতীয় ব্যতিক্রমগুলি সর্বদা পৃথক উপায়ে পরিচালনা করা যায়। এটিকে উত্পাদনের মধ্যে রাখার আগে, ইউনিকোডের সমস্ত অঞ্চলের বিরুদ্ধে ডায়ায়্রিটিক্স সহ চিঠিগুলি আরও ভালভাবে পরীক্ষা করা উচিত।
মিরোক্লাভ

5

মজার বিষয় এই জাতীয় প্রশ্ন এতগুলি উত্তর পেতে পারে এবং তবুও আমার প্রয়োজনীয়তার সাথে কোনওটিই ফিট করে না: চারপাশে অনেকগুলি ভাষা রয়েছে, একটি সম্পূর্ণ ভাষা অজ্ঞাবলিক সমাধান আফ্রিকের পক্ষে সত্যই সম্ভব নয়, কারণ অন্যরা উল্লেখ করেছেন যে ফর্মসি বা ফর্মডি সমস্যা দিচ্ছে।

যেহেতু মূল প্রশ্নটি ফরাসি সম্পর্কিত ছিল, তাই কাজটির সহজ উত্তরটি সত্যই

    public static string ConvertWesternEuropeanToASCII(this string str)
    {
        return Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(str));
    }

1251 ইনপুট ভাষার এনকোডিং কোড দ্বারা প্রতিস্থাপন করা উচিত।

এটি তবে কেবল একটি চরিত্রকে একটি অক্ষর দ্বারা প্রতিস্থাপন করবে। যেহেতু আমি জার্মান সাথে ইনপুট হিসাবেও কাজ করছি, তাই আমি একটি ম্যানুয়াল রূপান্তর করেছি

    public static string LatinizeGermanCharacters(this string str)
    {
        StringBuilder sb = new StringBuilder(str.Length);
        foreach (char c in str)
        {
            switch (c)
            {
                case 'ä':
                    sb.Append("ae");
                    break;
                case 'ö':
                    sb.Append("oe");
                    break;
                case 'ü':
                    sb.Append("ue");
                    break;
                case 'Ä':
                    sb.Append("Ae");
                    break;
                case 'Ö':
                    sb.Append("Oe");
                    break;
                case 'Ü':
                    sb.Append("Ue");
                    break;
                case 'ß':
                    sb.Append("ss");
                    break;
                default:
                    sb.Append(c);
                    break;
            }
        }
        return sb.ToString();
    }

এটি সেরা পারফরম্যান্স সরবরাহ করতে পারে না, তবে কমপক্ষে এটি পড়া এবং প্রসারিত করা খুব সহজ। রেজেক্স হ'ল কোনও জিও, কোনও চর / স্ট্রিং স্টাফের চেয়ে অনেক ধীর।

স্থান সরানোর জন্য আমার কাছে খুব সহজ একটি পদ্ধতি রয়েছে:

    public static string RemoveSpace(this string str)
    {
        return str.Replace(" ", string.Empty);
    }

অবশেষে, আমি উপরের 3 টি এক্সটেনশনের সংমিশ্রণটি ব্যবহার করছি:

    public static string LatinizeAndConvertToASCII(this string str, bool keepSpace = false)
    {
        str = str.LatinizeGermanCharacters().ConvertWesternEuropeanToASCII();            
        return keepSpace ? str : str.RemoveSpace();
    }

এবং এটির জন্য একটি ছোট ইউনিট পরীক্ষা (সম্পূর্ণ নয়) যা সফলভাবে পাস করে।

    [TestMethod()]
    public void LatinizeAndConvertToASCIITest()
    {
        string europeanStr = "Bonjour ça va? C'est l'été! Ich möchte ä Ä á à â ê é è ë Ë É ï Ï î í ì ó ò ô ö Ö Ü ü ù ú û Û ý Ý ç Ç ñ Ñ";
        string expected = "Bonjourcava?C'estl'ete!IchmoechteaeAeaaaeeeeEEiIiiiooooeOeUeueuuuUyYcCnN";
        string actual = europeanStr.LatinizeAndConvertToASCII();
        Assert.AreEqual(expected, actual);
    }

4

এটি জাভাতে কাজ করে।

এটি মূলত সমস্ত উচ্চারণকৃত অক্ষরকে তাদের ডিএসেন্টেড সমমনা অংশগুলিতে রূপান্তর করে যার পরে তাদের সম্মিলিত ডায়াক্রিটিক্সকে অনুসরণ করে। এখন আপনি ডায়রিটিক্সগুলি সরিয়ে ফেলার জন্য একটি রেজেক্স ব্যবহার করতে পারেন।

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

বা জাভা 7,"\\p{Block=CombiningDiacriticalMarks}"
ব্রেন্ট ফাউস্ট

11
আপনি যখন জাভা সমাধান পোস্ট করবেন কেন যখন প্রশ্নটি বিশেষ করে নেট থেকে জিজ্ঞাসা করবে?
ডেভিড

2
@ ডেভিড এই প্রশ্নটি "জাভা ড্রপ অ্যাকসেন্টস" এর জন্য গুগলে শীর্ষ-হিট। এটি এখানে অন্তর্গত বলে না, তবে এটি এখানে দরকারী।
blubb

3

টিএল; ডিআর - সি # স্ট্রিং এক্সটেনশন পদ্ধতি

আমি মনে করি স্ট্রিং এর অর্থ সংরক্ষণ করার সবচেয়ে ভালো সমাধান তাদের stripping, যা ভাল উদাহরণে দেখানো হয় পরিবর্তে অক্ষর রূপান্তর করতে হয় crème brûléeকরতে crme brleবনাম creme brulee

আমি উপরে আলেকজান্ডারের মন্তব্য পরীক্ষা করে দেখেছি এবং Lucene.Net কোডটি অ্যাপাচি ২.০ লাইসেন্সযুক্ত, তাই আমি ক্লাসটিকে একটি সাধারণ স্ট্রিং এক্সটেনশন পদ্ধতিতে পরিবর্তন করেছি। আপনি এটি এর মতো ব্যবহার করতে পারেন:

var originalString = "crème brûlée";
var maxLength = originalString.Length; // limit output length as necessary
var foldedString = originalString.FoldToASCII(maxLength); 
// "creme brulee"

ফাংশনটি স্ট্যাকওভারফ্লো উত্তরে পোস্ট করার জন্য খুব দীর্ঘ (30k এর ~ 139k অক্ষরটি ললকে অনুমতি দেয়) তাই আমি একটি বক্তব্য তৈরি করেছি এবং লেখককে দায়ী করেছি :

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/// <summary>
/// This class converts alphabetic, numeric, and symbolic Unicode characters
/// which are not in the first 127 ASCII characters (the "Basic Latin" Unicode
/// block) into their ASCII equivalents, if one exists.
/// <para/>
/// Characters from the following Unicode blocks are converted; however, only
/// those characters with reasonable ASCII alternatives are converted:
/// 
/// <ul>
///   <item><description>C1 Controls and Latin-1 Supplement: <a href="http://www.unicode.org/charts/PDF/U0080.pdf">http://www.unicode.org/charts/PDF/U0080.pdf</a></description></item>
///   <item><description>Latin Extended-A: <a href="http://www.unicode.org/charts/PDF/U0100.pdf">http://www.unicode.org/charts/PDF/U0100.pdf</a></description></item>
///   <item><description>Latin Extended-B: <a href="http://www.unicode.org/charts/PDF/U0180.pdf">http://www.unicode.org/charts/PDF/U0180.pdf</a></description></item>
///   <item><description>Latin Extended Additional: <a href="http://www.unicode.org/charts/PDF/U1E00.pdf">http://www.unicode.org/charts/PDF/U1E00.pdf</a></description></item>
///   <item><description>Latin Extended-C: <a href="http://www.unicode.org/charts/PDF/U2C60.pdf">http://www.unicode.org/charts/PDF/U2C60.pdf</a></description></item>
///   <item><description>Latin Extended-D: <a href="http://www.unicode.org/charts/PDF/UA720.pdf">http://www.unicode.org/charts/PDF/UA720.pdf</a></description></item>
///   <item><description>IPA Extensions: <a href="http://www.unicode.org/charts/PDF/U0250.pdf">http://www.unicode.org/charts/PDF/U0250.pdf</a></description></item>
///   <item><description>Phonetic Extensions: <a href="http://www.unicode.org/charts/PDF/U1D00.pdf">http://www.unicode.org/charts/PDF/U1D00.pdf</a></description></item>
///   <item><description>Phonetic Extensions Supplement: <a href="http://www.unicode.org/charts/PDF/U1D80.pdf">http://www.unicode.org/charts/PDF/U1D80.pdf</a></description></item>
///   <item><description>General Punctuation: <a href="http://www.unicode.org/charts/PDF/U2000.pdf">http://www.unicode.org/charts/PDF/U2000.pdf</a></description></item>
///   <item><description>Superscripts and Subscripts: <a href="http://www.unicode.org/charts/PDF/U2070.pdf">http://www.unicode.org/charts/PDF/U2070.pdf</a></description></item>
///   <item><description>Enclosed Alphanumerics: <a href="http://www.unicode.org/charts/PDF/U2460.pdf">http://www.unicode.org/charts/PDF/U2460.pdf</a></description></item>
///   <item><description>Dingbats: <a href="http://www.unicode.org/charts/PDF/U2700.pdf">http://www.unicode.org/charts/PDF/U2700.pdf</a></description></item>
///   <item><description>Supplemental Punctuation: <a href="http://www.unicode.org/charts/PDF/U2E00.pdf">http://www.unicode.org/charts/PDF/U2E00.pdf</a></description></item>
///   <item><description>Alphabetic Presentation Forms: <a href="http://www.unicode.org/charts/PDF/UFB00.pdf">http://www.unicode.org/charts/PDF/UFB00.pdf</a></description></item>
///   <item><description>Halfwidth and Fullwidth Forms: <a href="http://www.unicode.org/charts/PDF/UFF00.pdf">http://www.unicode.org/charts/PDF/UFF00.pdf</a></description></item>
/// </ul>
/// <para/>
/// See: <a href="http://en.wikipedia.org/wiki/Latin_characters_in_Unicode">http://en.wikipedia.org/wiki/Latin_characters_in_Unicode</a>
/// <para/>
/// For example, '&amp;agrave;' will be replaced by 'a'.
/// </summary>
public static partial class StringExtensions
{
    /// <summary>
    /// Converts characters above ASCII to their ASCII equivalents.  For example,
    /// accents are removed from accented characters. 
    /// </summary>
    /// <param name="input">     The string of characters to fold </param>
    /// <param name="length">    The length of the folded return string </param>
    /// <returns> length of output </returns>
    public static string FoldToASCII(this string input, int? length = null)
    {
        // See https://gist.github.com/andyraddatz/e6a396fb91856174d4e3f1bf2e10951c
    }
}

আশা করি এটি অন্য কাউকে সহায়তা করে, এটি আমার সর্বাধিক মজাদার সমাধান!


গুহাতসমূহ: 1) তত্ত্বটি স্থানীয়ভাবে নির্ভর। উদাহরণস্বরূপ, "ä" "এ" বা "আ" হতে পারে। 2) ভুলভাবে / ভুল ব্যাখ্যা করা হয়েছে: ফলাফলটি কেবলমাত্র C0 নিয়ন্ত্রণ এবং বেসিক ল্যাটিন ব্লক থেকেই আসে না। এটি কেবল লাতিন অক্ষর এবং কিছু প্রতীক রূপগুলিকে "সমতুল্য" রূপান্তর করে। (অবশ্যই, নন-সি0 নিয়ন্ত্রণগুলি এবং বেসিক ল্যাটিন ব্লক অক্ষরগুলি পরে পরিবর্তন করতে বা অপসারণ করতে অন্য একটি পাস নিতে পারে)) তবে এটি যা ভাল করবে তা করবে।
টম ব্লডজেট

2

এটি ভিবি সংস্করণ (গ্রিকের সাথে কাজ করে):

আমদানি সিস্টেম। পাঠ্য

আমদানি সিস্টেম.গ্লোবালাইজেশন

Public Function RemoveDiacritics(ByVal s As String)
    Dim normalizedString As String
    Dim stringBuilder As New StringBuilder
    normalizedString = s.Normalize(NormalizationForm.FormD)
    Dim i As Integer
    Dim c As Char
    For i = 0 To normalizedString.Length - 1
        c = normalizedString(i)
        If CharUnicodeInfo.GetUnicodeCategory(c) <> UnicodeCategory.NonSpacingMark Then
            stringBuilder.Append(c)
        End If
    Next
    Return stringBuilder.ToString()
End Function

1
একটি পুরানো উত্তর হতে পারে, তবে কেন আপনি ভেরিয়েবল ডিকোরিয়েশন এবং প্রথম নিয়োগের জন্য পৃথক লাইন ব্যবহার করছেন?
নিকিজে

2

ব্যবহার করে দেখুন HelperSharp প্যাকেজ

সরানোর পদ্ধতিগুলি রয়েছে:

 public static string RemoveAccents(this string source)
 {
     //8 bit characters 
     byte[] b = Encoding.GetEncoding(1251).GetBytes(source);

     // 7 bit characters
     string t = Encoding.ASCII.GetString(b);
     Regex re = new Regex("[^a-zA-Z0-9]=-_/");
     string c = re.Replace(t, " ");
     return c;
 }

2

এইভাবে আমি আমার সমস্ত নেট নেট প্রোগ্রামে ডায়াক্রিটিক অক্ষরগুলিকে নন-ডায়াক্রিটিকগুলিতে প্রতিস্থাপন করি

সি #:

//Transforms the culture of a letter to its equivalent representation in the 0-127 ascii table, such as the letter 'é' is substituted by an 'e'
public string RemoveDiacritics(string s)
{
    string normalizedString = null;
    StringBuilder stringBuilder = new StringBuilder();
    normalizedString = s.Normalize(NormalizationForm.FormD);
    int i = 0;
    char c = '\0';

    for (i = 0; i <= normalizedString.Length - 1; i++)
    {
        c = normalizedString[i];
        if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

    return stringBuilder.ToString().ToLower();
}

ভিবি। নেট:

'Transforms the culture of a letter to its equivalent representation in the 0-127 ascii table, such as the letter "é" is substituted by an "e"'
Public Function RemoveDiacritics(ByVal s As String) As String
    Dim normalizedString As String
    Dim stringBuilder As New StringBuilder
    normalizedString = s.Normalize(NormalizationForm.FormD)
    Dim i As Integer
    Dim c As Char

    For i = 0 To normalizedString.Length - 1
        c = normalizedString(i)
        If CharUnicodeInfo.GetUnicodeCategory(c) <> UnicodeCategory.NonSpacingMark Then
            stringBuilder.Append(c)
        End If
    Next
    Return stringBuilder.ToString().ToLower()
End Function

2

আপনি এমএমএলিব থেকে স্ট্রিং এক্সটেনশন ব্যবহার করতে পারেন x এক্সটেনশনগুলি নুগেট প্যাকেজ:

using MMLib.RapidPrototyping.Generators;
public void ExtensionsExample()
{
  string target = "aácčeéií";
  Assert.AreEqual("aacceeii", target.RemoveDiacritics());
} 

নিউজ পৃষ্ঠা: https://www.nuget.org/packages/MMLib.Extensions/ কোডপ্লেক্স প্রকল্পের সাইট https://mmlib.codeplex.com/


2

আপনি যদি ইতিমধ্যে বিবেচনা না করে থাকেন তবে এখানে এই লাইব্রেরিটি পপিং করা হচ্ছে। দেখে মনে হচ্ছে এটির সাথে ইউনিট পরীক্ষার পুরো পরিসীমা রয়েছে।

https://github.com/thomasgalliker/Diacritics.NET


1
Imports System.Text
Imports System.Globalization

 Public Function DECODE(ByVal x As String) As String
        Dim sb As New StringBuilder
        For Each c As Char In x.Normalize(NormalizationForm.FormD).Where(Function(a) CharUnicodeInfo.GetUnicodeCategory(a) <> UnicodeCategory.NonSpacingMark)  
            sb.Append(c)
        Next
        Return sb.ToString()
    End Function

এনএফসি এর পরিবর্তে এনএফডি ব্যবহারের ফলে অনুরোধ করা ছাড়িয়ে যাওয়া পরিবর্তন হতে পারে।
জন হান্না

1

এই ব্যক্তি যা বলেছেন:

Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));

এটা আসলে পছন্দ splits åএকটি অক্ষর (যা চরিত্র কোড যা 00E5, না 0061 প্লাস পরিবর্তক 030Aমধ্যে যা একই দেখাবে) aপ্লাস পরিবর্তক কিছু, এবং তারপর হওয়া ASCII রূপান্তর পরিবর্তক সরিয়ে ফেলা হবে, শুধুমাত্র ছাড়ার a


1

আমি সত্যই Azrafe7 দ্বারা সরবরাহিত সংক্ষিপ্ত এবং কার্যকরী কোড পছন্দ করি । সুতরাং, আমি এটিকে একটি এক্সটেনশন পদ্ধতিতে রূপান্তর করতে কিছুটা পরিবর্তন করেছি:

public static class StringExtensions
{
    public static string RemoveDiacritics(this string text)
    {
        const string SINGLEBYTE_LATIN_ASCII_ENCODING = "ISO-8859-8";

        if (string.IsNullOrEmpty(text))
        {
            return string.Empty;
        }

        return Encoding.ASCII.GetString(
            Encoding.GetEncoding(SINGLEBYTE_LATIN_ASCII_ENCODING).GetBytes(text));
    }
}

এটিই একমাত্র পদ্ধতি যা সমস্ত পোলিশ ডায়াক্রিটিক্সের সাথে কাজ করে। স্বীকৃত উত্তর Ł এবং ł অক্ষরের সাথে কাজ করে না।
ইয়ার্কি

-3

পর্যাপ্ত খ্যাতি নেই, স্পষ্টতই আমি আলেকজান্ডারের দুর্দান্ত লিঙ্কটিতে মন্তব্য করতে পারি না। - যৌক্তিক যুক্তিসঙ্গত ক্ষেত্রে লুসিনই একমাত্র সমাধান বলে মনে হচ্ছে।

একটি সাধারণ অনুলিপি-পেস্ট সমাধান চান তাদের জন্য, এটি লুসিনে লিভারেজিং কোড:

স্ট্রিং টেস্টবেড = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";

Console.WriteLine (Lucene.latinizeLucene (টেস্টবেড));

AAAACEIIOOOUUTHaaaaaaaeceeeeiiiidnoooouuaacDegiLlnOorSsszzsteu

//////////

public static class Lucene
{
    // source: https://raw.githubusercontent.com/apache/lucenenet/master/src/Lucene.Net.Analysis.Common/Analysis/Miscellaneous/ASCIIFoldingFilter.cs
    // idea: /programming/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net (scroll down, search for lucene by Alexander)
    public static string latinizeLucene(string arg)
    {
        char[] argChar = arg.ToCharArray();

        // latinizeLuceneImpl can expand one char up to four chars - e.g. Þ to TH, or æ to ae, or in fact ⑽ to (10)
        char[] resultChar = new String(' ', arg.Length * 4).ToCharArray();

        int outputPos = Lucene.latinizeLuceneImpl(argChar, 0, ref resultChar, 0, arg.Length);

        string ret = new string(resultChar);
        ret = ret.Substring(0, outputPos);

        return ret;
    }

    /// <summary>
    /// Converts characters above ASCII to their ASCII equivalents.  For example,
    /// accents are removed from accented characters. 
    /// <para/>
    /// @lucene.internal
    /// </summary>
    /// <param name="input">     The characters to fold </param>
    /// <param name="inputPos">  Index of the first character to fold </param>
    /// <param name="output">    The result of the folding. Should be of size >= <c>length * 4</c>. </param>
    /// <param name="outputPos"> Index of output where to put the result of the folding </param>
    /// <param name="length">    The number of characters to fold </param>
    /// <returns> length of output </returns>
    private static int latinizeLuceneImpl(char[] input, int inputPos, ref char[] output, int outputPos, int length)
    {
        int end = inputPos + length;
        for (int pos = inputPos; pos < end; ++pos)
        {
            char c = input[pos];

            // Quick test: if it's not in range then just keep current character
            if (c < '\u0080')
            {
                output[outputPos++] = c;
            }
            else
            {
                switch (c)
                {
                    case '\u00C0': // À  [LATIN CAPITAL LETTER A WITH GRAVE]
                    case '\u00C1': // Á  [LATIN CAPITAL LETTER A WITH ACUTE]
                    case '\u00C2': // Â  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
                    case '\u00C3': // Ã  [LATIN CAPITAL LETTER A WITH TILDE]
                    case '\u00C4': // Ä  [LATIN CAPITAL LETTER A WITH DIAERESIS]
                    case '\u00C5': // Å  [LATIN CAPITAL LETTER A WITH RING ABOVE]
                    case '\u0100': // Ā  [LATIN CAPITAL LETTER A WITH MACRON]
                    case '\u0102': // Ă  [LATIN CAPITAL LETTER A WITH BREVE]
                    case '\u0104': // Ą  [LATIN CAPITAL LETTER A WITH OGONEK]
                    case '\u018F': // Ə  http://en.wikipedia.org/wiki/Schwa  [LATIN CAPITAL LETTER SCHWA]
                    case '\u01CD': // Ǎ  [LATIN CAPITAL LETTER A WITH CARON]
                    case '\u01DE': // Ǟ  [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
                    case '\u01E0': // Ǡ  [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
                    case '\u01FA': // Ǻ  [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
                    case '\u0200': // Ȁ  [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
                    case '\u0202': // Ȃ  [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
                    case '\u0226': // Ȧ  [LATIN CAPITAL LETTER A WITH DOT ABOVE]
                    case '\u023A': // Ⱥ  [LATIN CAPITAL LETTER A WITH STROKE]
                    case '\u1D00': // ᴀ  [LATIN LETTER SMALL CAPITAL A]
                    case '\u1E00': // Ḁ  [LATIN CAPITAL LETTER A WITH RING BELOW]
                    case '\u1EA0': // Ạ  [LATIN CAPITAL LETTER A WITH DOT BELOW]
                    case '\u1EA2': // Ả  [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
                    case '\u1EA4': // Ấ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
                    case '\u1EA6': // Ầ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
                    case '\u1EA8': // Ẩ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
                    case '\u1EAA': // Ẫ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
                    case '\u1EAC': // Ậ  [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
                    case '\u1EAE': // Ắ  [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
                    case '\u1EB0': // Ằ  [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
                    case '\u1EB2': // Ẳ  [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
                    case '\u1EB4': // Ẵ  [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
                    case '\u1EB6': // Ặ  [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
                    case '\u24B6': // Ⓐ  [CIRCLED LATIN CAPITAL LETTER A]
                    case '\uFF21': // A  [FULLWIDTH LATIN CAPITAL LETTER A]
                        output[outputPos++] = 'A';
                        break;
                    case '\u00E0': // à  [LATIN SMALL LETTER A WITH GRAVE]
                    case '\u00E1': // á  [LATIN SMALL LETTER A WITH ACUTE]
                    case '\u00E2': // â  [LATIN SMALL LETTER A WITH CIRCUMFLEX]
                    case '\u00E3': // ã  [LATIN SMALL LETTER A WITH TILDE]
                    case '\u00E4': // ä  [LATIN SMALL LETTER A WITH DIAERESIS]
                    case '\u00E5': // å  [LATIN SMALL LETTER A WITH RING ABOVE]
                    case '\u0101': // ā  [LATIN SMALL LETTER A WITH MACRON]
                    case '\u0103': // ă  [LATIN SMALL LETTER A WITH BREVE]
                    case '\u0105': // ą  [LATIN SMALL LETTER A WITH OGONEK]
                    case '\u01CE': // ǎ  [LATIN SMALL LETTER A WITH CARON]
                    case '\u01DF': // ǟ  [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
                    case '\u01E1': // ǡ  [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
                    case '\u01FB': // ǻ  [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
                    case '\u0201': // ȁ  [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
                    case '\u0203': // ȃ  [LATIN SMALL LETTER A WITH INVERTED BREVE]
                    case '\u0227': // ȧ  [LATIN SMALL LETTER A WITH DOT ABOVE]
                    case '\u0250': // ɐ  [LATIN SMALL LETTER TURNED A]
                    case '\u0259': // ə  [LATIN SMALL LETTER SCHWA]
                    case '\u025A': // ɚ  [LATIN SMALL LETTER SCHWA WITH HOOK]
                    case '\u1D8F': // ᶏ  [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
                    case '\u1D95': // ᶕ  [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
                    case '\u1E01': // ạ  [LATIN SMALL LETTER A WITH RING BELOW]
                    case '\u1E9A': // ả  [LATIN SMALL LETTER A WITH RIGHT HALF RING]
                    case '\u1EA1': // ạ  [LATIN SMALL LETTER A WITH DOT BELOW]
                    case '\u1EA3': // ả  [LATIN SMALL LETTER A WITH HOOK ABOVE]
                    case '\u1EA5': // ấ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
                    case '\u1EA7': // ầ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
                    case '\u1EA9': // ẩ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
                    case '\u1EAB': // ẫ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
                    case '\u1EAD': // ậ  [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
                    case '\u1EAF': // ắ  [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
                    case '\u1EB1': // ằ  [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
                    case '\u1EB3': // ẳ  [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
                    case '\u1EB5': // ẵ  [LATIN SMALL LETTER A WITH BREVE AND TILDE]
                    case '\u1EB7': // ặ  [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
                    case '\u2090': // ₐ  [LATIN SUBSCRIPT SMALL LETTER A]
                    case '\u2094': // ₔ  [LATIN SUBSCRIPT SMALL LETTER SCHWA]
                    case '\u24D0': // ⓐ  [CIRCLED LATIN SMALL LETTER A]
                    case '\u2C65': // ⱥ  [LATIN SMALL LETTER A WITH STROKE]
                    case '\u2C6F': // Ɐ  [LATIN CAPITAL LETTER TURNED A]
                    case '\uFF41': // a  [FULLWIDTH LATIN SMALL LETTER A]
                        output[outputPos++] = 'a';
                        break;
                    case '\uA732': // Ꜳ  [LATIN CAPITAL LETTER AA]
                        output[outputPos++] = 'A';
                        output[outputPos++] = 'A';
                        break;
                    case '\u00C6': // Æ  [LATIN CAPITAL LETTER AE]
                    case '\u01E2': // Ǣ  [LATIN CAPITAL LETTER AE WITH MACRON]
                    case '\u01FC': // Ǽ  [LATIN CAPITAL LETTER AE WITH ACUTE]
                    case '\u1D01': // ᴁ  [LATIN LETTER SMALL CAPITAL AE]
                        output[outputPos++] = 'A';
                        output[outputPos++] = 'E';
                        break;
                    case '\uA734': // Ꜵ  [LATIN CAPITAL LETTER AO]
                        output[outputPos++] = 'A';
                        output[outputPos++] = 'O';
                        break;
                    case '\uA736': // Ꜷ  [LATIN CAPITAL LETTER AU]
                        output[outputPos++] = 'A';
                        output[outputPos++] = 'U';
                        break;

        // etc. etc. etc.
        // see link above for complete source code
        // 
        // unfortunately, postings are limited, as in
        // "Body is limited to 30000 characters; you entered 136098."

                    [...]

                    case '\u2053': // ⁓  [SWUNG DASH]
                    case '\uFF5E': // ~  [FULLWIDTH TILDE]
                        output[outputPos++] = '~';
                        break;
                    default:
                        output[outputPos++] = c;
                        break;
                }
            }
        }
        return outputPos;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.