tablica z ascii

0

Witam. Mam pytanie,w jaki sposób zdefiniować tablicę która by miała w sobie poszczególne znaki polskie w kodzie ascii.
Jest mi to potrzebne do napisania konwertera który by podmieniał miejscami elementy tablicy po ich wykryciu.
Chciałem to zrobić stosując poczciwego fora: np: przy konwertowaniu na mazovia itp.
Wcześniej robiłem to w c++ i nie miałem problemów.. ale teraz nie mogę sobie z tym poradzić.
Z góry wielkie dzięki za wszelką pomoc.

    public partial class Form1 : Form
    {
        string tekst;
        int dlugosc;
        string abcdef;

    ??   char[] tablica = new char[16]  {'a', 'c','e','l','o','s','z','z','A','C','E','L','O','S','Z','Z'};
   ??    char[] tablicapl = new char[17] { 'a' , 'ć', 'ę', 'ł', 'ó', 'ś', 'ż','ź','Ą','C','Ę','Ó','Ł','Ó','Ś','Ż','Ź'};
 //??  char[] cp852 = new char[16] { '0xA5', '0x86', '0xA9', '0x88', '0xE4', '0x98', '0xAB', '0xBE', '0xA4', '0x8F', '0x9D', '0xA8', '0x97', '0x8D', '0xBD', '0xA8'};
 // ??    char[] iso8859 = new char[16] { 177, 230, 234, 179, 241, 182, 188, 191, 161, 198, 163, 209, 211, 166, 172, 175, 202 };
//  ??    char[] win1250 = new char[16] { 0xB9, 0xE6, 0xEA, 0xB3, 0xF1, 0x9c, 0x9F, 0xBF, 0xA5, 0xE6, 0xA3, 0xD1, 0x8C, 0x8F, 0xAF, 0xCA };
//      char[] unicode = new char[16] { 165, 134, 169, 136, 228, 152, 171, 190, 164, 143, 157, 227, 151, 141, 189, 168 };
   //   char[] mazovia = new char[16] { 134, 141, 145, 146, 164, 158, 166, 167, 143, 149, 156, 165, 152, 160, 161, 144 };

       int j = 0;
        int i = 0;
        string zdanie;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string zdanie = Convert.ToString(textBox1.Text);
            for (int i = 0; i < textBox1.Text.Length; i++)
                for (j = 1; j < 16; j++)
                {

                    if ( textBox1.Text[i] == tablica[j])
                    {
                        zdanie[i]=tablicapl[j]
                    }
                }             
                     
               
                       textBox2.AppendText(zdanie);
        }
  

Czy można to zrobić w inny sposób??

0

A z czym masz problem, zobacz swój kod: dlaczego pierwsze dwie tablice mają różne rozmiary, popełniłeś w nich kilka literówek. Jakiego efektu oczekujesz? Dla jakich danych nie działa ?
Nie możesz odwoływać się do litery w stringu poprzez index, ten indexer jest tylko do odczytu.

            char[] latin = new char[] { 'a', 'c', 'e', 'l', 'o', 's', 'z', 'z', 'A', 'C', 'E', 'L', 'O', 'S', 'Z', 'Z' };
            char[] polish = new char[] { 'ą', 'ć', 'ę', 'ł', 'ó', 'ś', 'ż', 'ź', 'Ą', 'Ć', 'Ę', 'Ł', 'Ó', 'Ś', 'Ż', 'Ź' };
            string plText = "ąężźćłóŚć毯ŻŹŹĆ";
            bool exist;
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < plText.Length; i++)
            {
                exist = false;
                for (int j = 0; j < polish.Length; j++)
                {
                    if (plText[i].Equals(polish[j]))
                    {
                        builder.Append(latin[j]);
                        exist = true;
                        break;
                    }
                }
                if (!exist) builder.Append(plText[i]);
            }

            Console.WriteLine(builder.ToString());
0
serwert napisał(a)

Witam. Mam pytanie,w jaki sposób zdefiniować tablicę która by miała w sobie poszczególne znaki polskie w kodzie ascii.
Jest mi to potrzebne do napisania konwertera który by podmieniał miejscami elementy tablicy po ich wykryciu.
Chciałem to zrobić stosując poczciwego fora: np: przy konwertowaniu na mazovia itp.
Wcześniej robiłem to w c++ i nie miałem problemów.. ale teraz nie mogę sobie z tym poradzić.
Z góry wielkie dzięki za wszelką pomoc.
Czy można to zrobić w inny sposób??

Po pierwsze char z C++ i char z C# to dwa różne czary.

Po drugie przy konwersji kodowań należałoby raczej skorzystać z tablic typu byte, bo przecież tak są zapisywane znaki. Zresztą kodowanie znaków, jak sądzę, bardziej dotyczy operacji na plikach. Jeśli chcesz konwertować tekst z textboxa, który jest trzymany chyba w UTF16, to musiałbyś go najpierw skonwertować do tablicy byte, a następnie podmienić. Tzn. w ogóle nie rozumiem czemu chcesz podmieniać znaki w tekście z tekstboxa i co z nimi zrobić dalej, bo nawet jeśli wyświetlisz, to będą krzaki.

0

Celem programu jest szybka konwersja między znanymi standardami kodowań, który powinien to robić to w tzw "locie".
Chciałbym wykonać to w taki sposób: po wybraniu kontrolki z znanym kodowaniem, program skonwertował by tekst zawarty w textboxie1 lub schowku, a wynik wyświetlił w textboxie2.
Przyznaję że nie do końca przemyślałem algorytm w programie. Ale panowie nakierowaliście mnie na dobrą drogę :)

znalazłem że powinienem napisać deklarację tablic w postaci:
byte[] znaki = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 };
a następnie

 String decoded;

        //z byte[] na string
        private void button1_Click(object sender, EventArgs e)
        {
            Byte[] bytes = new Byte[] {
             65,  83,  67,  73,  73,  32,  69,
            110,  99, 111, 100, 105, 110, 103,
             32,  69, 120,  97, 109, 112, 108, 101};
       

            ASCIIEncoding ascii = new ASCIIEncoding();
            decoded = ascii.GetString(bytes);

            textBox1.Text = decoded;
        }

Czy w dobrym kierunku idę??

0

A co z System.Text.Encoding?

0

Ba, a StreamReader/StreamWriter ? Automatyczne rozpoznawanie kodowania, kodowanie w locie ... wszystko mają.

0
adf88 napisał(a)

Automatyczne rozpoznawanie kodowania

Mógłbyś to rozwinąć? Niby jak to działa?

0

np. taki UTF-16 ma na poczatku swojego strumienia cos, cos sie zwie utf preamble - dzieki czemu rozpoznajesz czy to utf16be czy utf16le. jak sie wycfanisz, to dzieki preamble mozesz rozpoznac tez czy strumien w ogole jest utf16 :)

0

No ale nie z kazdym sie tak da. Przykladowo UTF-8 bez BOM i ANSI dla czytacza wygladaja chyba tak samo.

0

Dokładnie chodzi o automatyczne rozpoznanie bom:
http://msdn.microsoft.com/en-us/library/7bc2hwcb.aspx

0

Niestety nie wiem w jaki sposób za pomocą steram reader i writer odnieść się do kodowania w locie. Rozumiem że dzieje się to przy odczycie z pliku txt. ale w jaki sposób odnieść się do schowka i ascii.
a znalazłem takie informacje z System.Text.Encoding Class

Characters are abstract entities that can be represented using many different character schemes or codepages. For example, Unicode UTF-16 encoding represents, or encodes, characters as sequences of 16-bit integers while Unicode UTF-8 represents the same characters as sequences of 8-bit bytes.

The BCL includes the following types derived from Encoding:

* ASCIIEncoding - encodes Unicode characters as 7-bit ASCII characters. This encoding only supports code points between U+0000 and U+007F inclusive.

* UnicodeEncoding - encodes each Unicode character as two consecutive bytes. Both little-endian and big-endian byte orders are supported.

* UTF8Encoding - encodes Unicode characters using the UTF-8 (UCS Transformation Format, 8-bit form) encoding. This encoding supports all Unicode character values.

An application can use the properties of this class such as System.Text.Encoding.ASCII, System.Text.Encoding.Default, System.Text.Encoding.Unicode, and System.Text.Encoding.UTF8 to obtain encodings. Applications can initialize new instances of Encoding objects through the ASCIIEncoding, UnicodeEncoding, and UTF8Encoding classes.

0

Nie tylko z pliku, z każdego dowolnego strumienia. Piszesz "w locie" to chodzi ci o strumień tak ? Czy o coś innego ? Oprócz czytania pliku i strumienia można czytać strumieniowo tekst (StringReader).
Można też hurtowo zamieniać tekst na bajty lub bajty na tekst (bajty w zadanym kodowaniu) przy użyciu klas Encoding (np. te, które wymieniłeś). Służą do tego metody GetBytes i GetString.

0

Czy zamiana bajtów na tekst tyczy się każdego kodowania? tzn.. od mazovi po iso8859-2

Wielkie dzięki za podsunięcie pomysłu..

0
serwert napisał(a)

Czy zamiana bajtów na tekst tyczy się każdego kodowania? tzn.. od mazovi po iso8859-2
Tak, tu masz opis i przykład:
http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

0
adf88 napisał(a)

Dokładnie chodzi o automatyczne rozpoznanie bom:
http://msdn.microsoft.com/en-us/library/7bc2hwcb.aspx

Czyli tylko UTFy. Win, iso, mac i innych to nie obsłuży.

adf88 napisał(a)
serwert napisał(a)

Czy zamiana bajtów na tekst tyczy się każdego kodowania? tzn.. od mazovi po iso8859-2
Tak, tu masz opis i przykład:
http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

Obawiam się jednak, że Mazovię trzeba obsłużyć samemu :]

0

nie tylko mazovię, ale i cp852.. dodatkowo nie wiem jakie Encoding zmieniło by polskie znaki diakrytyczne na "bez polskich znaków".

poza tym Encoding działa mi bez zarzutu dla kilku kodowań..
Czyli jednak pozostaje zabawa z strumieniami.

0

No faktycznie Mazovii nie ma (zdaje się że wyszła z użycia ?) Najlepiej napisać własną klasą dziedziczącą po Encoding do obsługi Mazovii (trzeba napisać własny Encoder i Decoder).

cp852 jest:
"852 | ibm852 | Central European (DOS)"

0

Mam problem z użyciem cp852 gdyż gdy wpisałem tak..

string tekst = Convert.ToString(textBox1.Text);


                                          string unicodeString = tekst;
                                                      
                                         
                                          Encoding unicode = Encoding.Unicode;
                                          Encoding IBM852 = Encoding.ibm852;

                                          
                                          byte[] unicodeBytes = unicode.GetBytes(unicodeString);

                                          
                                          byte[] IBM852Bytes = Encoding.Convert(unicode, IBM852, unicodeBytes);

                                          char[] IBM852Chars = new char[IBM852.GetCharCount(IBM852Bytes, 0, IBM852Bytes.Length)];
                                          IBM852.GetChars(IBM852Bytes, 0, IBM852Bytes.Length, IBM852Chars, 0);
                                          string IBM852String = new string(IBM852Chars);

                                          textBox2.AppendText(IBM852String);

otrzymuję komunikat error 'System.Text.Encoding' does not contain a definition for 'ibm852'
w jaki sposób mam zapisać tę nazwę kodowania by to działało?

0

Naucz się korzystać z dokumentacji, bo daleko nie zajedziesz:

The Encoding class is primarily intended to convert between different encodings and Unicode. Often one of the derived Unicode classes is the correct choice for your application.

Your applications use the GetEncoding method to obtain other encodings. They should use the GetEncodings method to get a list of all encodings.

The following table lists the supported encodings and their associated code pages. An asterisk in the last column indicates that the code page is natively supported by the .NET Framework, regardless of the underlying platform.

...
http://msdn.microsoft.com/en-us/library/system.text.encoding_members.aspx
http://msdn.microsoft.com/en-us/library/system.text.encoding.getencoding.aspx

0
adf88 napisał(a)

No faktycznie Mazovii nie ma (zdaje się że wyszła z użycia ?)

Nie wyszła - nadal jest używana w różnych archaicznych systemach, nawet w wakacje pisałem komponent, który miał importować dane z plików zapisanych tym kodowaniem do bazy danych.
Z Mazovią jest taki problem, że M$ nigdy jej nie uznał i nie zapewniał wsparcia do niej, prawdopodobnie dlatego, że jest to w sumie nasz lokalny, polski wynalazek.

0

Najlepiej napisać własną klasą dziedziczącą po Encoding do obsługi Mazovii (trzeba napisać własny Encoder i Decoder).

Tylko Mazovia została mi do zrobienia, ale raczej to przerasta moje umiejętności.
Muszę poszukać informacji na ten temat, to może jakoś pójdzie.

Chciałbym podziękować wszystkim za pomoc, naprawdę gratuluje wam waszej znajomości tematu.
Pozdrawiam

Z Mazovią już sobie poradziłem, szukam sposobu na automatyczne wykrycie kodowania i znalazłem..

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=469

ale nie wiem czy jest to optymalne rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1