работы с кодировками

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 9 июн 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Есть ли API для смены кодировок KOI-8 в DOS/utf8, DOS в KOI8/utf8, utf8 в DOS/KOI8 ?
     
  2. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    libiconv :)
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Я так понимаю юникод нельзя на ХР сп3 перевести в UTF8 через WideCharToMultiByte
    ?
    Вот код программы, он отлично переводить DOS -> CP_1251, CP_1251 -> DOS, UTF8 -> CP_1251/DOS, а вот так чтоб на выходе был UTF8, никак...
    GetLastError() возвращает 1004(что значит неверный флаг).
    Думал поставить WC_ERR_INVALID_CHARS как флаг, но он для висты и више (.
    Есть ли какой то способ на WINAPI сделать чтоб и UTF8 работал ?

    Код (Text):
    1. #include "stdafx.h"
    2. #include "windows.h"
    3. #define F1  0
    4. #define F2  1
    5.  
    6. #define C1  2
    7. #define C2  3
    8. #define C3  3
    9.  
    10.  
    11. UINT GetCharSet(char *name)
    12. {  
    13.     if (_stricmp(name,"DOS") == 0) return CP_OEMCP;
    14.     if (_stricmp(name,"KOI8") == 0) return CP_UTF8;
    15.     if (_stricmp(name,"CP_1251") == 0) return CP_ACP;
    16.     return -1;
    17. };
    18. int main(int argc, char* argv[])
    19. {  
    20.     DWORD s,s1;
    21.     char * buf;
    22.     HANDLE h;
    23.     UINT CodePage1 = GetCharSet(argv[1]),CodePage2=GetCharSet(argv[2]);
    24.     WCHAR * wbuf = 0;
    25. if ((CodePage1 == -1) | (CodePage2 == -1))
    26. {  
    27.     MessageBox(0,"unknow char set\n","ERROR",MB_ICONERROR);
    28.     return -1;
    29. };
    30.     h = CreateFile(argv[3],GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    31. if (h == INVALID_HANDLE_VALUE)
    32. {
    33.   MessageBox(0,"can'nt open file\n","ERROR",MB_ICONERROR);
    34.   return -1;
    35. };
    36.     s = GetFileSize(h,0);
    37.     buf = new char [s+1]; buf[s] = 0;
    38.     ReadFile(h,&buf[0],s,&s,0);
    39.     CloseHandle(h);
    40.  // переобразование текста в юникод  
    41.     s1=MultiByteToWideChar(CodePage1,MB_ERR_INVALID_CHARS,buf,-1,0,0);
    42. if (s1 == 0)
    43. {
    44.     MessageBox(0,"Convert Error","ERROR",MB_ICONERROR);
    45.     return -1;
    46. };
    47.     wbuf = new WORD[s1+1];      wbuf[s1] = 0;
    48.     s1=MultiByteToWideChar(CodePage1,MB_ERR_INVALID_CHARS,buf,-1,wbuf,s1);
    49.  
    50. //переобразование из юникода в заданую кодировку
    51.     s1 = WideCharToMultiByte(CodePage2,WC_COMPOSITECHECK,wbuf,-1,buf,0,(const char*)0,false);
    52.     GetLastError();
    53. if (s1 == 0)
    54. {
    55.     MessageBox(0,"Convert Error","ERROR",MB_ICONERROR);
    56.     return -1;
    57. };
    58.     delete[] buf;
    59.     buf = new char [s1 + 1]; buf[s1] = 0;
    60.     s1 = WideCharToMultiByte(CodePage2,WC_COMPOSITECHECK,wbuf,-1,buf,s1,(const char*)0,false);
    61. //запись результата в файл
    62.     h = CreateFile(argv[4],GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    63. if (h == INVALID_HANDLE_VALUE)
    64. {
    65.     MessageBox(0,"Can'nt create file","ERROR",MB_ICONERROR);
    66.     return -1;
    67. };
    68.     WriteFile(h,(void*)buf,s1,&s1,0);
    69.    CloseHandle(h);
    70.  MessageBoxW(0,wbuf,(WORD*)"",0);
    71. MessageBox(0,"All compleat","GOOD",MB_OK | MB_SYSTEMMODAL);
    72. delete [] wbuf;
    73. delete [] buf;
    74.     return 0;
    75. }
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Вроде ж в MSDN чётко сказано: для UTF-8 dwFlags или 0 или WC_ERR_INVALID_CHARS. Раз не Vista, значит должен быть 0. Я попробовал, по крайней мере русские буквы берёт на "ура".

    lpUsedDefaultChar, кстати, не BOOL а указатель на него.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    XshStasX
    Код (Text):
    1. char *to_utf8(const char *ascii)
    2. {
    3.   char  *utf8 = NULL;
    4.   WCHAR *wide = NULL;
    5.   int    len;
    6.  
    7.   if (0 == IsBadStringPtr(ascii, (UINT_PTR ) -1))
    8.   {
    9.     len = MultiByteToWideChar(CP_ACP, 0, ascii, -1, NULL, 0);
    10.     if (0 != len)
    11.     {
    12.       wide = (WCHAR *) GlobalAlloc(GPTR, sizeof(WCHAR) * len);
    13.       if (NULL != wide)
    14.       {
    15.         if (0 != MultiByteToWideChar(0, 0, ascii, -1, wide, len))
    16.         {
    17.           len = WideCharToMultiByte(CP_UTF8, 0, wide, -1, NULL, 0, 0, 0);
    18.           if (0 != len)
    19.           {
    20.             utf8 = (char *) GlobalAlloc(GPTR, sizeof(char) * len);
    21.             if (NULL != utf8)
    22.             {
    23.               if (0 == WideCharToMultiByte(CP_UTF8, 0, wide, -1, utf8, len, 0, 0))
    24.               {
    25.                 GlobalFree((HGLOBAL) utf8);
    26.                 utf8 = NULL;
    27.               }
    28.             }
    29.           }
    30.         }
    31.         GlobalFree((HGLOBAL) wide);
    32.         wide = NULL;
    33.       }
    34.     }
    35.   }
    36.  
    37.   return utf8;
    38. }
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    q_q
    спасибо )
    В чем преимущество брать память из кучи а не к примеру через VirtualAlloc ?
    А насколько быстрей GlobalAlloc от VirtualAlloc ?
    Или разница только в том что VirtualAlloc выделяет по 64кб ?
     
  8. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А как быть с KOI8 ее тоже нужно перевести в Unicode и обратно ?
    WideCharToMultiByte/MultiByteToWideChar я так понимаю они не катят (...
    Желательно без сторонних библиотек, но если никак то можно и их.
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Для KOI8-R код 20866. Полагаю, нужно заменить CP_ACP на 20866.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?id=27860
    http://www.wasm.ru/forum/viewtopic.php?pid=313226#p313226