Avatar billede macpain Nybegynder
10. maj 2007 - 17:36 Der er 5 kommentarer og
1 løsning

ANSI til UTF-8

Jeg har et lille problem!!

Først en lille pre. spørgsmål, ret mig her hvis jeg tager fejl:
Unicode = UTF-8 = Multibyte Chracters
og
ANSI = Wide characters

Er det korrekt?

Når men til mit problem:
Jeg vil gerne have konverteret fra ANSI til UTF-8, hvordan gør jeg det?

Jeg har lavet følgende men jeg syntes ikke det virker!!
std::string str = "Streng der er modtaget!!";
WCHAR *pstrRet = new WCHAR[str.size()];
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)str.c_str()/*ANSI*/, -1, (LPSTR)pstrRet, sizeof(pstrRet), 0, 0); //From ANSI to UTF-8

Mit problem er at den streng jeg modtager "bare" bliver konverteret til Ansii (char *), så jeg ved ikke helt hvad jeg får(og dog!!)! Hvis man evt. kunne checke der man får, kunne det være lækkert....laver det i VS8 så jeg har ikke .Net muligheder
Avatar billede arne_v Ekspert
10. maj 2007 - 17:44 #1
nej - ANSI er single byte - wide er Unicode
Avatar billede arne_v Ekspert
10. maj 2007 - 17:53 #2
og UTF-8 er en variabelt antal byte repraesentation af unicode
Avatar billede krismort Nybegynder
10. maj 2007 - 21:22 #3
du kan osse bruge wsprintf
Avatar billede macpain Nybegynder
11. maj 2007 - 10:37 #4
Altså:
ANSI = Single Byte
Wide Charaters = Unicode
UTF-8 = Multibyte characters (~Unicode multibyte repræsentation)

Men hvordan kommer man så fra ANSI -> UTF-8: WideCharToMultiByte eller wsprintf
eller en tredje måde
Avatar billede macpain Nybegynder
11. maj 2007 - 15:16 #5
Dette blev løsningen:

char * CJMS::atou(char* str)
{
  if(str==NULL)
    return str;

  long ilen = strlen(str);
  wchar_t *wstr = new wchar_t[ilen+1];
  memset(wstr, 0, sizeof(wchar_t) * ilen);
  long lLen = MultiByteToWideChar(CP_ACP,0,str,-1,wstr,ilen);
  str[0] = '\0';//Bare for at sikre at der bliver lagt informationer over i str
  WideCharToMultiByte ( CP_UTF8, 0, wstr, -1, str, ilen, NULL, NULL );
  delete[] wstr;
  int len = strlen(str);//Er der information - nok!!

  return str;
}
Avatar billede arne_v Ekspert
12. maj 2007 - 06:07 #6
alternativ (som ikke afhænger af Windows):

void atou(const char* sin, char *sout)
{
    int ix = 0;
    for(int i = 0; i <= strlen(sin); i++)
    {
        int v = (unsigned char)sin[i];
        if(v < 128)
        {
            sout[ix] = v;
            ix++;
        }
        else
        {
            sout[ix] = 0xC0 | (v / 64);
            ix++;
            sout[ix] = 0x80 | (v % 64);
            ix++;
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester