Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Преобразование кириллицы в HEX


Автор: savage_fx 20.2.2010, 16:08
Как на Java перекодировать слово "Привет" к виду "0xd0bfd180d0b8d0b2d0b5d182" ?




Автор: powerOn 20.2.2010, 16:21
Может быть так:

Код

        final String message = "Привет";
        for(int i = 0; i < message.length(); i++) {
            System.out.print(Integer.toHexString(message.charAt(i)));
        }

Автор: savage_fx 20.2.2010, 16:32
Цитата(powerOn @ 20.2.2010,  16:21)
Может быть так:

Код

        final String message = "Привет";
        for(int i = 0; i < message.length(); i++) {
            System.out.print(Integer.toHexString(message.charAt(i)));
        }






Выводит "41f440438432435442", а должно "0xd0bfd180d0b8d0b2d0b5d182". 

Для проверки значения, можно перекодировать любое русское слово в HEX-16 например через NotePad++



Автор: mbasil 20.2.2010, 16:53
У меня под рукой была программа кодирования, а ответ такой: 041F04400438043204350442.
Откуда вы взяли, что должно быть "0xd0bfd180d0b8d0b2d0b5d182"?
Код

import java.io.*;

public class EncodeUni{

    /** A table of hex digits */
    private static final char[] hexDigit = {
        '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    private static final String LINESEP = System.getProperty("line.separator");

    public EncodeUni() {
    }
    public int encript( char[] arChi, int offset, int count,
                        char[] outBbuff, boolean escapeSpace ) {
        int n = 0, len;
        len = offset + count;
        for( int i=offset; i < len; i++ ) {
            char aChar = arChi[i];
            // Handle common case first, selecting largest block that
            // avoids the specials below
            if ((aChar > 61) && (aChar < 127)) {
                if (aChar == '\\') {
                    outBbuff[n++] = '\\';      outBbuff[n++] = '\\';
                    continue;
                }
                outBbuff[n++] = aChar;
                //outBuffer.append(aChar);
                continue;
            }
            switch(aChar) {
                case ' ':
                    if (i == 0 || escapeSpace) outBbuff[n++] = '\\';
                    outBbuff[n++] = ' ';
                    break;
                case '\t': outBbuff[n++] ='\t';
                           break;
                case '\n': String s = LINESEP;
                           int l = s.length();
                           for(int j=0; j < l; j++) outBbuff[n++] = s.charAt(j);
                           break;
                case '\r': // outBbuff[n++] ='\\';
                           outBbuff[n++] ='\r';
                           break;
                case '\f': // outBbuff[n++] ='\\';
                           outBbuff[n++] ='\f';
                           break;
                case '=': // Fall through
                case ':': // Fall through
                case '#': // Fall through
                case '!':  // outBbuff[n++] ='\\';
                           outBbuff[n++] = aChar;
                           break;
                default:
                    if ((aChar < 0x0020) || (aChar > 0x007e)) {
                        outBbuff[n++] = toHex((aChar >> 12) & 0xF);
                        outBbuff[n++] = toHex((aChar >>  8) & 0xF);
                        outBbuff[n++] = toHex((aChar >>  4) & 0xF);
                        outBbuff[n++] = toHex( aChar        & 0xF);
                    } else {
                        outBbuff[n++] = aChar;
                    }
            }
        }
        return( n );
    }
    /**
     * Convert a nibble to a hex character
     * @param   nibble  the nibble to convert.
     */
    private static char toHex(int nibble) {
        return hexDigit[(nibble & 0xF)];
    }
   public static void main(String[] args) {

//    int MAX_BUFLEN = 1024;
//    char[] inBbuff = new char[MAX_BUFLEN];
    String sin = "Привет";
    char[] inBbuff = sin.toCharArray();
    int count = inBbuff.length;
    char[] outBuff = new char[(count+10)*4]; 
    EncodeUni eu = new EncodeUni(); 
    int n = eu.encript( inBbuff, 0, count, outBuff, false );
    String s = new String( outBuff, 0, n );
    Console cons = System.console();
    cons.printf( "<"+s+">");
   }      
}

Автор: savage_fx 20.2.2010, 17:07
Попробуйте NotePad++

1) Введите слово "Привет"
2) Выберите из строки меню "TextFX" -> "TextFX Convert" -> "Convert text to HEX-16"


Также можно создать файл, напишите там слово "Привет" и сохраните в UTF-8 
Потом откройте HEX редактором и посмотрите

Будет именно "d0bfd180d0b8d0b2d0b5d182"

Автор: mbasil 20.2.2010, 17:36
Зависит от внутренней кодировки, в которой текст набран.
В Java внутреннее представление одно, а в ваших инструментах видимо другое.
Вы кодируете не то, как слово Привет видно, а внутренние коды символов.

Автор: powerOn 21.2.2010, 18:59
Цитата(savage_fx @  20.2.2010,  16:32 Найти цитируемый пост)
Выводит "41f440438432435442"


Цитата(mbasil @  20.2.2010,  16:53 Найти цитируемый пост)
У меня под рукой была программа кодирования, а ответ такой: 041F04400438043204350442.


Если приглядеться то одно и тоже. В первом случе лишь не хватает 0 перед кодом символа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)