Gå til innhold

Hvordan Unicode->ASCII(8b)


Anbefalte innlegg

Jeg lurte på om noen viste hvordan man kan konvertere fra vanlige ASCII bokstaver som unicode til ASCII.

Det hadde også være fint om noen viste om en metode for å finne ut om tegnene ikke er mulig konvertere til ASCII (eks. hvis det er japanske tegn.)

 

Takker for alle svar.

Endret av Giddion
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+142

du kan alltids se på denne, men e ikkje helt sikker på om det e en sånn du vil ha...

konverterer uansett et tegn til en ASCII-verdi

 

sånn ser det ut:

 

Skriv inn et tegn: A

 

    Tegnet "A" har ASCII-verdien 65

 

Trykk en tast for å fortsette...

 

 


//
//@mariyo
//
#include <iostream>
#include <cctype>
#include <cstdlib>
#include <string>
using namespace std;

int main()
{
   char l1;
   cout << "Skriv inn et tegn: ";
   cin >> l1;
   int t1 = l1;
   cout << endl << "     " << "Tegnet \"" << l1 << "\" har ASCII-verdien " << t1 << endl << endl;
   system("pause");
}



 

håper det virker ;)

 

EDIT: fikset litt på koden

Endret av Slettet+142
Lenke til kommentar
Jeg lurte på om noen viste hvordan man kan konvertere fra vanlige ASCII bokstaver som unicode til ASCII.

Det hadde også være fint om noen viste om en metode for å finne ut om tegnene ikke er mulig konvertere til ASCII (eks. hvis det er japanske tegn.)

 

Takker for alle svar.

6941435[/snapback]

 

Ikke sikker på om jeg forstår spørsmålet, men her har du en algoritme: http://paste.lisp.org/display/26809

 

Om jeg sier (urlEncode "nøstdal") så får jeg ut "n%C3%B8stdal" .. du ser at unicode 'ø' altså er representert av to ascii-tegn/verdier C3 og B8 (i hex). Om du vil ha disse til ascii er det bare å gå fra hex --> ascii noe som er triviellt.

 

edit:

forøvrig tatt fra http://nostdal.org/~lars/programming/lisp/...xo/web/url.lisp dette

 

edit2:

ups; indenteringen er gal et sted der (på paste.lisp.org i hvertfall), 64 er for langt til venstre - og skal se slik ut:

                   (setf res (mkstr res (valueHex (+ 192 (/ (- val (mod val 64))
                                                            64)))))

 

..64 er altså det man dividerer med..

Endret av lnostdal
Lenke til kommentar

Det her kommer litt an på hvordan Unicodebokstavene er formatert. Du har kanskje hørt om UTF-8, UTF-16, UTF-32, UCS-32 osv?

 

Dette er forskjellige måter å formatere Unicodetegn på. UTF-8 består av bytesekvenser, UTF-16 av 2-bytesekvenser og UTF-32 er alltid 4 bytes (fordi 4 bytes er nok til å representere alle Unicodetegn).

 

I Unicodeverden har alle tegn en unik ID fra 0x00 til 0x10FFFF. ASCII-verdiene er de første og er dermed kompatibelt med ASCII (den er faktisk også kompatibel med Latin-1 eller ISO-8859-1 som det mer presist heter). Dette er grunnen til at UTF-8 blir identisk med ASCII. UTF-8 kan derimot ikke representere Latin1-supplementet som har verdiene 0xA0 - 0xFF med 1 byte. Disse tegnene blir representert med 2 bytes i UTF-8. Byteverdiene bestemmes ut fra en spesfisert bitdistribusjonsmodell (sjekk Google).

 

Så svaret er egentlig enkelt. Siden vi snakker om ASCII (som er tegnene 0x00 - 0x7F) kan du bare caste tegnene til en char hvis det er snakk om UTF-8, UTF-16, UTF-32 eller lignende (som det "alltid" er). Hvis du skal støtte Latin1 fra UTF-8 blir det litt mer komplisert (ikke veldig) siden de vil være representert med 2 bytes. Men du bør uansett ta høyde for lengre bytesekvenser hvis du jobber med UTF-8. Det finnes masse dokumentasjon om dette via Google så jeg anbefaler den veien. Men jeg svarer mer en gjerne hvis du har noen konkrete spørsmål.

 

Til slutt vil jeg nevne at wchar_t i Windows er UTF-16 og Linuxsystemene som regel bruker UTF-32.

 

 

Edit: glemte å nevne at hvis du leser fra en fil må du ta hensyn til byterekkefølge (eng. byte order) hvis det er noe annet enn UTF-8. Dette gjøres ved å lese BOM i begynnelsen av fila (igjen sjekk Google). UTF-8 har ikke denne problematikken siden den består av bytesekvenser.

Endret av kjetil7
Lenke til kommentar

Ojoj takker for all respons.

 

Jeg bruker wchar_t beklager at jeg ikke har nevnt dette tidligere, men min kunnskap om emnet er ganske begrenset.

Stringene får jeg via et lib så jeg slipper å tenke på lesing fra fil.

 

Prosessen skal kjøres i forbindelse med en konvertering av en fil så hastighet er ikke så viktig.

 

Så kan jeg egentlig "bare" lage en stor stygg switch som tar inn Unicode ser om verdien er tilstede hvis ikke er det en ukonverterbart tegn.

Og jeg trenger "bare" 256 verdier og det vil sikkert ta kortere tid en å kikke på nettet (fant ingen c/c++ kode som gjorde jobben).

 

ps: Det er mulig koden til lnostdal gjør jobben, men min Lisp er litt! rusten :)

 

Takker for alle svar

Lenke til kommentar

Da kan du bruke wcstombs hvis det er ok å bruke programmets locale (se setlocale).

 

Hvis du er avhengig av å ikke bruke programmets locale må du ta i bruk standardbiblioteket til C++. Klassen du skal kikke på heter std::codecvt sammen med std::use_facet. Sjekk ut dokumentasjonen og eventuelt Google for mer info rundt de. De kan være litt vanskelige å forstå for et utrent øye. wcstombs vil nok i det fleste tilfeller være mer enn bra nok.

Endret av kjetil7
Lenke til kommentar

Denne koden ser ut til å funke med æ, ø, å og andre bokstaver.

Dette er kun et eksempel.

 

std::basic_string <wchar_t> UniString;
size_t ascii_size =  wcstombs (0,UniString.c_str(),0);

if (UniString.size() != ascii_size)
{
//hmm... et av tegnene kan ikke beskrives som ASCII
//dvs bruker mer enn 1 byte
return;
}

char* AsciiString = new char[ascii_size];
size_t ascii_size =  wcstombs (AsciiString ,UniString.c_str(),ascii_size);

 

Takker igjen for alle svar.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...