Giddion Skrevet 26. september 2006 Del Skrevet 26. september 2006 (endret) 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 27. september 2006 av Giddion Lenke til kommentar
Gjest Slettet+142 Skrevet 26. september 2006 Del Skrevet 26. september 2006 (endret) 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 26. september 2006 av Slettet+142 Lenke til kommentar
lnostdal Skrevet 26. september 2006 Del Skrevet 26. september 2006 (endret) 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 26. september 2006 av lnostdal Lenke til kommentar
kjetil7 Skrevet 26. september 2006 Del Skrevet 26. september 2006 (endret) 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 26. september 2006 av kjetil7 Lenke til kommentar
Giddion Skrevet 26. september 2006 Forfatter Del Skrevet 26. september 2006 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
kjetil7 Skrevet 26. september 2006 Del Skrevet 26. september 2006 (endret) 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 26. september 2006 av kjetil7 Lenke til kommentar
lnostdal Skrevet 26. september 2006 Del Skrevet 26. september 2006 *snip*ps: Det er mulig koden til lnostdal gjør jobben, men min Lisp er litt! rusten Takker for alle svar 6946731[/snapback] Jeg kan altids oversette den til C om du skulle stå helt fast. Lenke til kommentar
Giddion Skrevet 27. september 2006 Forfatter Del Skrevet 27. september 2006 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå