[C#] ASCII kodovani

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod slawe 15. 4. 2012 18:15

Zdravím, takový drobný dotaz - nevíte, jaké ASCII tabulky využívá C#? Jestli UTF-8 nebo více? Totiž dělám takový drobný ASCII překladač, a když převadím znaky jako ščř atd, tak se mi při zpětném překladu vytisknou nesmysly. Případně jde to nějak nastavit, nebo je na to vhodnější kod, než jaký mám já a který si i s diakritikou poradí??

Kód: Vybrat vše
// DO ASCII
for (int i = 0; i < vstupnitext.Length; i++) {
  this.ascii[i]=System.Convert.ToInt32(vstupnitext[i]);
}

//DO ZNAKU
for (int i = 0; i < vstupnitext.Length; i++) {
  text[i] = System.Convert.ToString(System.Convert.ToChar(this.ascii[i]));
}


Děkuji
slawe
Kolemjdoucí

Odeslat příspěvekod Wikan 15. 4. 2012 18:21

ASCII tabulka je jenom jedna.
Čeho chceš vlastně dosáhnout?
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod slawe 15. 4. 2012 19:01

Do 128. znaku ano, ale pak se to, pokud vim, lisi podle kodovani, a hlavne pozice specialnich znaku a diakritickych pismen.
Cílem je udělat překladač textu skrze ascii tabulku do dvojkové a šestnáctkové soustavy a zpět samozřejmě.

Ted, když jsem si chtěl vyhodit příklad, který bych tu hodil, tak mě to hodilo zajimavější úkaz - 'š' mi to přeložilo jako 101100001, v dekadické soustavě 353. Co si pamatuju z přednášky, tak pro češtinu jsou i znaky jako š,č,ř atd kodovány v 8 bitové soustavě, tedy do 255. Nezavisle na tom, jestli se používá Windows 1250 nebo UTF-8
slawe
Kolemjdoucí

Odeslat příspěvekod PiranhaGreg 15. 4. 2012 19:25

Kód: Vybrat vše
            string text = "Příliš žluťoučký kůň úpěl ďábelské ódy";

            int[] binar = new int[text.Length];

            for (int i = 0; i < text.Length; i++)
                binar[i] = (int)text[i];

            // Výpis v binární soustavě
            foreach (var item in binar)
                Console.WriteLine(Convert.ToString(item, 2));

            // A převod zpět
            StringBuilder puvodniText = new StringBuilder();
            for (int i = 0; i < binar.Length; i++)
                puvodniText.Append((char)binar[i]);

            Console.WriteLine("\n" + puvodniText.ToString());
Tak jsem něco splácal. Ale ten můj kód to přímo do dvojkové soustavy nepřevádí, to bych se musel kouknout po nějaký třídě, která to zprostředkovává. Pořád ještě úplně nevím o co ti přesně jde. Jestli jenom o vypsání nebo o kompletní převod...

Ale teď jsem to zkoušel rvát jen do prvních 8 bitů a fakt že se to tam moc nevleze. Jdu se na to ještě kouknout 8-) .
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Wikan 15. 4. 2012 19:29

Jenže pak už nejde o ASCII tabulku.
"č" v UTF-8 je 1100010010001101. Ve 1250 je to 11101000.
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod slawe 15. 4. 2012 19:50

PiranhaGreg: To převádí do desítkové a z té potom dle výběru do binární, hexadecimální anebo to nechá v desítkové. To je okenní aplikace, kde je 8 radio buttonů, 4 pro typ vstupu a 4 pro typ vystupu. Vstupem může být text nebo binární,desítkové ši šestnáctkové číslo. A stejné možnosti jsou u výstupu.


Wikan: A sakra, tak to potom vysvětluje všechny mé problémy. Takže leda nastavit, ať to pracuje s Win 1250, pokud chci pracovat s českými znaky, ono to pracuje ja nevim s cim, ale 8bitove to neni...
slawe
Kolemjdoucí

Odeslat příspěvekod PiranhaGreg 15. 4. 2012 20:14

Tak už jsem to úspěšně nacpal do 8 bitů 8-) .

Kód: Vybrat vše
string text = "Příliš žluťoučký kůň úpěl ďábelské ódy";

byte[] binary = Encoding.UTF8.GetBytes(text);

for (int i = 0; i < text.Length; i++)
   Console.WriteLine(text[i] + " - " + Convert.ToString(binary[i], 16).ToUpper() + " " + Convert.ToString(binary[i], 2));

string novyText = System.Text.Encoding.UTF8.GetString(binary);

Console.WriteLine("\n" + novyText);
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod Nargon 16. 4. 2012 05:53

Gratuluju, sice se ti to povedlo ale UTF8 je UTF-8 ktere ma 1 az 4B dlouhe zakodovani pro jednotlive znaky. Takze to neni tech tvych 256 hodnot z kodovacich tabulek.
To co ty hledas je jedna z X tabulek kodovani znaku, ktere vychazeji z ascii a hornich 128 znaku maji kodovane pro nejaky jazyk.
Mrkni sem: http://msdn.microsoft.com/en-us/library ... oding.aspx
A tam dole najdes seznam kodovacich stranek, a zalezi pro jakou "lokalizovanou ascii" tabulku chces to kodovani vyrobit.
Doporucuju jedno z techto:
852 - Latin2 (stare DOS kodovani)
1250 - Windows 1250 (defaultni windows kodovani pro cesko)
28592 - ISO 8859-2 (kodovani cestiny v linuxu)

A pouziti je snadne:
byte[] binary = Encoding.GetEncoding(852).GetBytes(text);
string novyText = Encoding.GetEncoding(852).GetString(binary);

Timto opravdu dostanes ten retezec v zadanem kodovani.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod slawe 16. 4. 2012 21:31

Jasně, pochopil jsem. Díky kolegové za cenné rady :)
slawe
Kolemjdoucí

Odeslat příspěvekod PiranhaGreg 26. 4. 2012 20:41

Jak zjistím číslo nějakého znaku pod jiným kódováním jak výchozím (UTF-16)? Mám soubor, který je zakódovaný ve Windows-1250 a vždycky je v něm část, která udává délku následujícího stringu. Jenže jakmile je ta délka větší jak 128, tak mi to vyhodí nějaký nesmyslně velký číslo, protože ten znak v UTF-16 je úplně jinde než ten stejný ve Windows-1250...
PiranhaGreg
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod PiranhaGreg 26. 4. 2012 21:58

Tak u Windows-1250 to bylo naštěstí jednoduchý...

Kód: Vybrat vše
int cislo = Encoding.GetEncoding("Windows-1250").GetBytes("" + char)[0];
PiranhaGreg
Mírně pokročilý
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků