ozgun
ozgun

Reputation: 263

How to convert Turkish chars to English chars in a string?

string strTurkish = "ÜST";

how to make value of strTurkish as "UST" ?

Upvotes: 21

Views: 30111

Answers (8)

Santiago Squarzon
Santiago Squarzon

Reputation: 60060

Two different approaches, first one using Regex.Replace with a MatchEvaluator:

var text = "üıöçşğ";
var unaccentedText = Regex.Replace(text.Normalize(NormalizationForm.FormD), @"\p{M}",
    static e => e.Value == "ı" ? "i" : "");

And the second one using string.Create:

var text = "üıöçşğ";
var unaccentedText = string.Create(text.Length, text,
    static (chars, state) =>
    {
        int idx = 0;
        foreach (char c in state.Normalize(NormalizationForm.FormD))
        {
            if (char.GetUnicodeCategory(c) == UnicodeCategory.NonSpacingMark)
            {
                continue;
            }

            if (c == 'ı')
            {
                chars[idx++] = 'i';
                continue;
            }

            chars[idx++] = c;
        }
    });

Upvotes: 0

Eser Cengiz
Eser Cengiz

Reputation: 1

    public static string TurkishChrToEnglishChr(this string text)
    {
        if (string.IsNullOrEmpty(text)) return text;

        Dictionary<char, char> TurkishChToEnglishChDic = new Dictionary<char, char>()
        {
            {'ç','c'},
            {'Ç','C'},
            {'ğ','g'},
            {'Ğ','G'},
            {'ı','i'},
            {'İ','I'},
            {'ş','s'},
            {'Ş','S'},
            {'ö','o'},
            {'Ö','O'},
            {'ü','u'},
            {'Ü','U'}
        };

        return text.Aggregate(new StringBuilder(), (sb, chr) =>
        {
            if (TurkishChToEnglishChDic.ContainsKey(chr))
                sb.Append(TurkishChToEnglishChDic[chr]);
            else
                sb.Append(chr);

            return sb;
        }).ToString();
    }

Upvotes: 0

Umut D.
Umut D.

Reputation: 1846

public string TurkishCharacterToEnglish(string text)
{
    char[] turkishChars = {'ı', 'ğ', 'İ', 'Ğ', 'ç', 'Ç', 'ş', 'Ş', 'ö', 'Ö', 'ü', 'Ü'};
    char[] englishChars = {'i', 'g', 'I', 'G', 'c', 'C', 's', 'S', 'o', 'O', 'u', 'U'};
    
    // Match chars
    for (int i = 0; i < turkishChars.Length; i++)
        text = text.Replace(turkishChars[i], englishChars[i]);

    return text;
}

Upvotes: 11

ogun
ogun

Reputation: 1334

You can use the following method for solving your problem. The other methods do not convert "Turkish Lowercase I (\u0131)" correctly.

public static string RemoveDiacritics(string text)
{
    Encoding srcEncoding = Encoding.UTF8;
    Encoding destEncoding = Encoding.GetEncoding(1252); // Latin alphabet

    text = destEncoding.GetString(Encoding.Convert(srcEncoding, destEncoding, srcEncoding.GetBytes(text)));

    string normalizedString = text.Normalize(NormalizationForm.FormD);
    StringBuilder result = new StringBuilder();

    for (int i = 0; i < normalizedString.Length; i++)
    {
        if (!CharUnicodeInfo.GetUnicodeCategory(normalizedString[i]).Equals(UnicodeCategory.NonSpacingMark))
        {
            result.Append(normalizedString[i]);
        }
    }

    return result.ToString();
}

Upvotes: 24

Rasim Yılmaz
Rasim Yılmaz

Reputation: 37

Public Function Ceng(ByVal _String As String) As String
    Dim Source As String = "ığüşöçĞÜŞİÖÇ"
    Dim Destination As String = "igusocGUSIOC"
    For i As Integer = 0 To Source.Length - 1
        _String = _String.Replace(Source(i), Destination(i))
    Next
    Return _String
End Function

Upvotes: 2

kulukrok
kulukrok

Reputation: 877

This is not a problem that requires a general solution. It is known that there only 12 special characters in Turkish alphabet that has to be normalized. Those are ı,İ,ö,Ö,ç,Ç,ü,Ü,ğ,Ğ,ş,Ş. You can write 12 rules to replace those with their English counterparts: i,I,o,O,c,C,u,U,g,G,s,S.

Upvotes: 3

L.B
L.B

Reputation: 116138

var text = "ÜST";
var unaccentedText  = String.Join("", text.Normalize(NormalizationForm.FormD)
        .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark));

Upvotes: 31

Jon Skeet
Jon Skeet

Reputation: 1500665

I'm not an expert on this sort of thing, but I think you can use string.Normalize to do it, by decomposing the value and then effectively removing an non-ASCII characters:

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

class Test
{
    static void Main()
    {
        string text = "\u00DCST";
        string normalized = text.Normalize(NormalizationForm.FormD);
        string asciiOnly = new string(normalized.Where(c => c < 128).ToArray());
        Console.WriteLine(asciiOnly);
    }    
}

It's entirely possible that this does horrible things in some cases though.

Upvotes: 8

Related Questions