Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C#: Unicode-merkkien tulostaminen

MtJ [27.05.2011 14:42:36]

#

Jossakin vaiheessa tuli törmättyä Unicode-merkkeihin ja eri kieliversioiden monenlaisiin merkistöihin, joista piti saada yksinkertainen hakulause. Näkyviin piti saada jossakin muodossa e-kirjaimesta kaikki eri muodot, kuten é,ë,jne. Tässä olisi kahteen funktioon mahdutettu em. toiminnallisuus, jossa tulostetaan kirjainta käyttämällä merkkijonoksi kaikki eri variaatiot unicode-merkkikirjastosta.

Tämä on tehty käyttäen hyväksi Visual Studio 2010:ta. Toimii Windows Formin pohjalta, johon on tehty textbox1 kirjaimen syöttämistä varten, sekä richtextbox2 tulostamista varten. Lisänä on 1 painike, josta käännös aloitetaan.

Koodi on varsin simppeli ja vain pientä testausta ennen varsinaista projektiin liittämistä, joten antanette anteeksi esim. virheenkorjauksen puuttumisen ja sellaiset seikat.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;

namespace CharConverter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

       private string StripAccents(string s)
        {
          StringBuilder sb = new StringBuilder();
          foreach (char c in s.Normalize(NormalizationForm.FormKD))
            switch (CharUnicodeInfo.GetUnicodeCategory(c))
            {
              case UnicodeCategory.NonSpacingMark:
              case UnicodeCategory.SpacingCombiningMark:
              case UnicodeCategory.EnclosingMark:
                break;

              default:
                sb.Append(c);
                break;
            }

            return sb.ToString();
        }

        private string ReverseNormalized(char c)
        {
            string entity = "";
            string strChar = "";
            string strCompareChar = "";
            strCompareChar = c.ToString();
            var charInfo = Enumerable.Range(0, 0x110000).Where(x => x < 0x00d800 || x > 0x00dfff).Select(char.ConvertFromUtf32).GroupBy(s => char.GetUnicodeCategory(s, 0)).ToDictionary(g => g.Key);
            foreach (var ch in charInfo[UnicodeCategory.LowercaseLetter]) {
                strChar = ch.Normalize(NormalizationForm.FormKD).ToString();

                if(strCompareChar.Equals(StripAccents(strChar))) {
                    entity = entity + strChar;
                }

            }
            return entity;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(textBox1.Text != "") {
                textBox2.Text = "";
                textBox2.Text = "Normalized format: " + StripAccents(textBox1.Text) + "\r\n";
                if (StripAccents(textBox1.Text) == textBox1.Text)
                {
                    textBox2.Text = textBox2.Text + "Reversed options: " + ReverseNormalized(Convert.ToChar(textBox1.Text)) + "\r\n";
                }
                else
                {
                    textBox2.Text = textBox2.Text + "Can't reverse, already Unicode char.";
                }
                } else {
                textBox2.Text="Write character to convert.";
            }
        }
    }
}

Metabolix [28.06.2012 22:03:18]

#

Koodivinkeissä täytyy aina selittää kunnolla, mitä tehdään ja miksi. Tällä hetkellä myös koodin sisennykset ovat pielessä. Lisäksi varsinaisten vinkkifunktioiden olisi minusta tyylikkäämpää olla staattisina ja julkisina omassa luokassaan erillisenä koodilistauksena ilman ylimääräisiä using-rivejä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta