Требуется помощь с кодировкой

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by m1nt@ll, 10 Feb 2012.

  1. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Добрый день.

    Я пишу программу, которая читает память из процесса (hl2.exe) и записывает в файл. Но при попытке считать символы, которые не неходятся в стандартной таблице ANSI ( я имею в виду русские символы ), выводятся какие-то кракозябры. Пробовал использовать setlocale, CharToOem. Ничего не помогает :(

    PS. Символы не в юникоде.
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    m1nt@ll, хекс аналог какой-нибудь строчки из процесса выложи проще будет сказать что за кодировка используется
     
  3. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Вот пример вывода:
    Code:
    Radar base: 1EB3D134
    Client count: 9 
    0: test_С'РчС_С'[100]; Name in hex: 0x00000074 0x00000065 0x00000073 0x00000074 0x0000005F 0xFFFFFF91 0x00000027 0xFFFFFF90 0xFFFFFFE7 0xFFFFFF91 0x0000005F 0xFFFFFF91 0x00000027
    1: Elmer[100]; Name in hex: 0x00000045 0x0000006C 0x0000006D 0x00000065 0x00000072
    2: Henry[100]; Name in hex: 0x00000048 0x00000065 0x0000006E 0x00000072 0x00000079
    3: Tim[100]; Name in hex: 0x00000054 0x00000069 0x0000006D
    4: Albert[100]; Name in hex: 0x00000041 0x0000006C 0x00000062 0x00000065 0x00000 072 0x00000074
    5: Martin[100]; Name in hex: 0x0000004D 0x00000061 0x00000072 0x00000074 0x00000 069 0x0000006E
    6: Wyatt[100]; Name in hex: 0x00000057 0x00000079 0x00000061 0x00000074 0x00000074
    7: Clarence[100]; Name in hex: 0x00000043 0x0000006C 0x00000061 0x00000072 0x000 00065 0x0000006E 0x00000063 0x00000065
    8: Jason[100]; Name in hex: 0x0000004A 0x00000061 0x00000073 0x0000006F 0x000000 6E
    У индекса 0 ник test_тест

    Вот функция вывода имени, думаю, зря к DWORD* привел).

    HTML:
    for( int i = 0; i < strlen( szNameBuffer ); i++ ) 					
    {
     	std::cout << "0x" << (DWORD*)szNameBuffer[i] << " "; 							
    }
    PS. Мне кажется, символы хранятся в UCHAR'е, там больше места для хранения символа, нежели в CHAR'e, но вот как их прочитать оттуда? =)
     
    #3 m1nt@ll, 10 Feb 2012
    Last edited: 10 Feb 2012
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    m1nt@ll, CharToOem и OemToChar в помощь!
     
  5. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Благодарю за внимательное прочтение моего первого поста. ;)

    PS. Возможно не уточнил, что OemToCharA тоже не работает.
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    0: test_С'РчС_С'[100]; Name in hex: 0x74 0x65 0x73 0x74 0x5F 0x91 0x27 0x90 0xE7 0x91 0x5F 0x91 0x27

    ANSI -> OEM -> HEX
    test_С'РчС_С' -> test_‘'ђз‘_‘' -> 0x74, 0x65, 0x73, 0x74, 0x5F, 0x91, 0x27, 0x90, 0xE7, 0x91, 0x5F, 0x91, 0x27

    ну и кто читает невнимательно?
     
  7. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Я не совсем понял, что вы имеете в виду. Согласитесь, что
    Code:
    ‘'ђз‘_‘'
    не очень похоже на
    Code:
    тест
    . Русские символы, как я вижу, хранятся в 2х байтах, а английские в 1. Как это вообще понимать? :confused:

    PS. Сорри, если чего не понял. Раньше не имел опыта в изменении кодировок.
     
  8. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    так и понимать.
    есть 8 бит таблицы ANSI, 2 в степени 8 = 256 различных вариантов представления цирковых клоунов текста.
    первые 0-127 символов - строго US 001 кодинг со времён телеграфа.
    остальные - до 255, это зависит от региональных установок компа, мейл-сервера и погоды.

    сам переводил вручную, названия нечитабельных кракозябрами фот в мейл от юных интернет-красавиц, с-хрен-пойми-какой-кодировкой они шлют мессаги ))

    в Вашем случае - utf-8 С'РчС_С и именно он так показывается на компе с русской кодировкой.

    попробуйте в региональных настройках компа изменить - "Показывать non-Unicode" на англ и русс, и сравните.
     
    #8 altblitz, 11 Feb 2012
    Last edited: 11 Feb 2012
  9. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Скажите, есть какие-нить windows-функции для перевода такой строки в юникод?
     
  10. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    объем перевода был небольшим, и сделал на коленках, набросав на js простейший браузер-ретранслятор.

    если нужно, должно быть на сайте Артёма, Лебедев который.
     
  11. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    К сожалению, не нашел транслятор в JS скриптах сайта студии Лебедева, но, в любом случае, спасибо за наводку. Попробую найти исходник транслятора в сырцах NP++ :)
     
  12. m1nt@ll

    m1nt@ll New Member

    Joined:
    9 Feb 2012
    Messages:
    19
    Likes Received:
    1
    Reputations:
    0
    Решил проблему, если кто-то столкнется с чем-то подобным, есть либа utfcpp.
    http://sourceforge.net/projects/utfcpp/