Millä Delphi-funktiolla voi testata sisältääkö teksti unicodea?

Anonyymi

Olen tehnyt Delphillä tekstinkäsittelysovelluksen, joka voi tallentaa Memon tekstin valinnan mukaan joko ANSI- tai UTF8-tiedostoksi. Delphin Memo on oletuksena unicode-muotoinen. Nyt jos käyttäjä on esim. copy/pastettanut Memo-kenttään unicode sisältävää tekstiä, niin nämä unicode-merkit eivät tallennu ANSI-tiedostoon, joka on siis se vanha perus tekstitiedostomuoto. UTF8-tekstin tallennan eri koodilla. Esim. Notepad varoittaa käyttäjää, jos tallennettava teksi sisältää Unicode-muodossa olevia merkkejä ja kehottaa valitsemaan unicode-tallenusmuodon ANSI:n sijaan.
Millä Delphi-funktiolla voin testata, josko Memo-kenttä sisältää unicode merkkejä, eikä siis ole 'ANSI safe', jolloin voin varoittaa käyttäjää samalla tavalla kuin Notepad tekee?

4

684

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Yksinkertainen niksi olisi mitata kuinka monta 8-bit tavua se vie tilaa suhteessa merkkien määrään. Jos on eroa, siellä on unicode merkkejä.

      Oikeasti paras tapa selvitä harmeilta on tallentaa ihan kaikki UTF8:na, ja jos on vanhaa merkistöä niin korvata UTF8:na.

    • Anonyymi

      UTF-8 ja Ansikoodaus eivät käytä nollatavua (0). Sitä käytetään korkeintaan lopetusmerkkinä nollaan päättyvissä merkkijonoissa.

      Pascalissa voidaan käyttää pointtereita eli osoittimia:
      https://wiki.freepascal.org/Pointer/fi

      Pointterin osoittamaa dataa osoitetaan hattumerkillä ^
      https://wiki.freepascal.org/^/fi

      Pointteri saadaan osoittamaan
      osoiteoperaattorilla @ joka palauttaa muuttujan osoitteen.
      https://wiki.freepascal.org/@/fi

      Esim. käskyllä
      var ptr : Pointer;
      //....
      ptr := @s; // pointer ptr saa muuttujan s osoitteen
      //...
      Pbyte(ptr)^)

      saat selville ptr muuttujan osoittaman tavun.

      Käyt tekstiä tavuina niin kauan läpi että siellä on nolla tai olet tekstin lopussa. Jos siellä on nolla niin se ei ole UTF-8 eikä Ansia vaan jotain muuta unicodea.

    • Anonyymi

      Var a:String; b:ansistring;
      begin
      a:=Memo1.Lines.Text;
      b:=AnsiSTring(a);
      if b<>a then

    • Anonyymi

      Pelkkä ANSi ei ole riittävän tarkaa määrittämään koodausta. Delpissä String tyyppi on UTF-16LE. Siinä siis kukin merkki vie joko 2 tai 4 tavua. Unicoden ensimmäisen tason merkit (ekat 64K) olvat UTF-16 kaksitavausia. Loppujen tasosen merkit ovat 4-tavusia. AnsiString taas perustuu johonkin Windows koodisivuus. Valitettavasti AnsiString tyyppi ei sisällä tätä koodiasivua vaan merkkijonon purkamiseen käytetään ohjelman oletuskoodiasivua. Se taas riippuu Windows_n asetuksiat. Suomalaisessa, englantialaisessa ja kaikkissa länsi-euroopan kielissä oletuskoodiasivu on 1252, mutta noita koodisivuja on useistä. Euroopalaiset koodisivut ovat yksitavuosia eli yksia merkki on aika yksi tavua. Aasialaiset taa ovat monitavuosia joissa yksi merkki on yksi tai kaksi tavua. Sitten on Utf8String joka itseasiassa on AnsiString jonka koodiasiuna on UTF-8. Yheteistä näill kaikille ANSI koodauksille on se että ASCII vie aina yhden tavun.

      Itse alkuperäiseen kysymykseen. Jotta voit tarkoistaa onko vain ANSI sinun pitää käydä läpi merkki kerrallaan ja tarkistaa kuuluuku merrkki koodisivuun vain ei. Jos ei niin sulla on merkkejä joita koodisivua ei tue ja näinolleen sitä ei voi tallettaa AnsiString:nä käyttäen tätä koodiasivua. Siis joko käytä toista koodiaivua tai UTF-8.

      Ongelmana on jos käytät toista koodisivua muta Notepad olettaa niin osa merkeistä näkyy mojibake:na (katso Wikipedia)

    Ketjusta on poistettu 3 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Hengenvaaralliset kiihdytysajot päättyivät karmealla tavalla, kilpailija kuoli

      Onnettomuudesta on aloitettu selvitys. Tapahtuma keskeytettiin onnettomuuteen. Tapahtumaa tutkitaan paikan päällä yhtei
      Kauhava
      198
      6908
    2. Ootko rakastunut?

      Kerro pois nyt
      Ikävä
      159
      2036
    3. Onhan sulla nainen parempi mieli

      Nyt? Ainakin toivon niin.
      Ikävä
      113
      1688
    4. Ujosteletko tosissaan vai mitä oikeen

      Himmailet???? Mitä pelkäät?????
      Ikävä
      51
      1390
    5. Suureksi onneksesi on myönnettävä

      Että olen nyt sitten mennyt rakastumaan sinuun. Ei tässä mitään, olen kärsivällinen ❤️
      Ikävä
      55
      1238
    6. Möykkähulluus vaati kuolonuhrin

      Nuori elämä menettiin täysin turhaan tällä järjettömyydellä! Toivottavasti näitä ei enää koskaan nähdä Kauhavalla! 😢
      Kauhava
      50
      1098
    7. Älä mies pidä mua pettäjänä

      En petä ketään. Älä mies ajattele niin. Anteeksi että ihastuin suhun varattuna. Pettänyt en ole koskaan ketään vaikka hu
      Ikävä
      100
      1074
    8. Reeniähororeeniä

      Helvetillisen vaikeaa työskennellä hoitajana,kun ei kestä silmissään yhtään läskiä. Saati hoitaa sellaista. Mitä tehdä?
      Kouvola
      7
      996
    9. Tarvitsemme lisää maahanmuuttoa.

      Väestö eläköityy, eli tarvitsemme lisää tekeviä käsiä ja veronmaksajia. Ainut ratkaisu löytyy maahanmuutosta. Nimenomaan
      Maailman menoa
      251
      954
    10. Kävit nainen näemmä mun

      Facessa katsomassa....
      Ikävä
      41
      929
    Aihe