Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой 
:(
    Опции темы
zolim
  Дата 26.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.3.2009
Где: Uzbekistan, Tashk ent

Репутация: нет
Всего: нет



Друзья! Помогите пожалуйста, здесь у меня БОЛЬШАЯ проблема!
Код

class Temp {
    public static void main(String args[]) {
        char ascii[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};
        String S = new String(ascii);
        String a="";
        try {
            a=new String(S.getBytes("ISO8859_1"));
            System.out.println(a.charAt(129));
            System.out.println(a.indexOf("Б"));
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

Здесь 
Код
a=new String(S.getBytes("ISO8859_1"));
 я изменил ISO8859_1, UTF-8, KOI8-R, UNICODE. Но именно с ISO8859_1 он работает правильнее.
Здесь 
Код
 System.out.println(a.charAt(129)) 
 результат - Б, а здесь 
Код
 System.out.println(a.indexOf("Б")); 
. - 193. Почему???
То есть результат таков: В строке символ с индексам 129 - Б, а индекс Б на строке - 193  smile 
Народ, где мояя ошибка, ПОМОГИТЕ!!!
PM MAIL ICQ GTalk   Вверх
MisterCleric
Дата 26.5.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 5
Всего: 38



Надо решить в какой кодировке генерируется байткод твоего класса. Вот в той кодировке и будет твой символ 
Цитата

"Б"


Низя такие проги писать. Может потом не запуститься на операционке, где нет соответствующего фонта


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4EJIOBEK
Дата 26.5.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 26.3.2007

Репутация: нет
Всего: 4



добавь просто цикл для проверки символов установленной кодировки
Код

            for (int i = 0 ;i < 256; i++ ){
             System.out.println(a.charAt(i));
            }


PM MAIL ICQ   Вверх
zolim
Дата 26.5.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.3.2009
Где: Uzbekistan, Tashk ent

Репутация: нет
Всего: нет



Да! Я знаю...
Проблема у меня такая:
Мне надо реализовать алгоритм MD5, хотя я знаю что есть стандартный класс MD5. С начало я думал, смотря на псевдокод MD5 в Википедии. Но не получилось. Потом нашел исходник этого алгоритма, и запустил, он с символами латиницы работает правильно, потому что индекс на таблицах символы латиницы везде одинаковые. Друг мой реализовал MD5 на C#, и дает результат с стандартным классом java одинаковый. И смотрели таблица символов, у друга буквы кириллицы начинается с 128. А у меня (UNICODE) начинается с 1040 - А, 1041 - Б,... Я не знал что делать и вот появилось тот проблема. И поэтому написал тот программу. Может кто нибудь знает как получить национальный ASCII? На Википедии написано что стандартные символы (0...127) ASCII везде одинаковые, а символы с индексами 128...255 разные (национальные). Я зацикливал на этой проблеме. Что мне делать. На счет использование стандартного класса, можно использовать, но мне надо самому понять и реализовать MD5. Посоветуйте пожалуйста!!!  smile 

Все таки я оставлю исходник MD5, может посмотрите...
Код

import java.io.*;

class MD5 {
  private static long S11 = 7L;
  private static long S12 = 12L;
  private static long S13 = 17L;
  private static long S14 = 22L;
  private static long S21 = 5L;
  private static long S22 = 9L;
  private static long S23 = 14L;
  private static long S24 = 20L;
  private static long S31 = 4L;
  private static long S32 = 11L;
  private static long S33 = 16L;
  private static long S34 = 23L;
  private static long S41 = 6L;
  private static long S42 = 10L;
  private static long S43 = 15L;
  private static long S44 = 21L;
 
  private static char pad[] = {128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                              0, 0, 0, 0, 0, 0, 0, 0, 0};
  private char bytBuffer[] = new char[64];
  private long lngState[] = new long[4];
  private long lngByteCount = 0;

  MD5() {
    this.init();
  }

  private static long[] decode(char bytBlock[]) {
    long lngBlock[] = new long[16];
    int j = 0;
    for(int i = 0; i < bytBlock.length; i += 4) {
        lngBlock[j] = bytBlock[i] + bytBlock[i+1] * 256L + bytBlock[i+2] * 65536L + bytBlock[i+3] * 16777216L;
        j++;
    }
    return(lngBlock);
  }

 
  private static void transform(long lngState[], char bytBlock[]) {
    long lngA = lngState[0];
    long lngB = lngState[1];
    long lngC = lngState[2];
    long lngD = lngState[3];
    long x[] = new long[16];

    x = decode (bytBlock);

    /* Round 1 */
    lngA = ff (lngA, lngB, lngC, lngD, x[ 0], S11, 3614090360L); /* 1 */
    lngD = ff (lngD, lngA, lngB, lngC, x[ 1], S12, 3905402710L); /* 2 */
    lngC = ff (lngC, lngD, lngA, lngB, x[ 2], S13, 606105819L); /* 3 */
    lngB = ff (lngB, lngC, lngD, lngA, x[ 3], S14, 3250441966L); /* 4 */
    lngA = ff (lngA, lngB, lngC, lngD, x[ 4], S11, 4118548399L); /* 5 */
    lngD = ff (lngD, lngA, lngB, lngC, x[ 5], S12, 1200080426L); /* 6 */
    lngC = ff (lngC, lngD, lngA, lngB, x[ 6], S13, 2821735955L); /* 7 */
    lngB = ff (lngB, lngC, lngD, lngA, x[ 7], S14, 4249261313L); /* 8 */
    lngA = ff (lngA, lngB, lngC, lngD, x[ 8], S11, 1770035416L); /* 9 */
    lngD = ff (lngD, lngA, lngB, lngC, x[ 9], S12, 2336552879L); /* 10 */
    lngC = ff (lngC, lngD, lngA, lngB, x[10], S13, 4294925233L); /* 11 */
    lngB = ff (lngB, lngC, lngD, lngA, x[11], S14, 2304563134L); /* 12 */
    lngA = ff (lngA, lngB, lngC, lngD, x[12], S11, 1804603682L); /* 13 */
    lngD = ff (lngD, lngA, lngB, lngC, x[13], S12, 4254626195L); /* 14 */
    lngC = ff (lngC, lngD, lngA, lngB, x[14], S13, 2792965006L); /* 15 */
    lngB = ff (lngB, lngC, lngD, lngA, x[15], S14, 1236535329L); /* 16 */
    
    /* Round 2 */
    lngA = gg (lngA, lngB, lngC, lngD, x[ 1], S21, 0xf61e2562L); /* 17 */
    lngD = gg (lngD, lngA, lngB, lngC, x[ 6], S22, 0xc040b340L); /* 18 */
    lngC = gg (lngC, lngD, lngA, lngB, x[11], S23, 0x265e5a51L); /* 19 */
    lngB = gg (lngB, lngC, lngD, lngA, x[ 0], S24, 0xe9b6c7aaL); /* 20 */
    lngA = gg (lngA, lngB, lngC, lngD, x[ 5], S21, 0xd62f105dL); /* 21 */
    lngD = gg (lngD, lngA, lngB, lngC, x[10], S22,  0x2441453L); /* 22 */
    lngC = gg (lngC, lngD, lngA, lngB, x[15], S23, 0xd8a1e681L); /* 23 */
    lngB = gg (lngB, lngC, lngD, lngA, x[ 4], S24, 0xe7d3fbc8L); /* 24 */
    lngA = gg (lngA, lngB, lngC, lngD, x[ 9], S21, 0x21e1cde6L); /* 25 */
    lngD = gg (lngD, lngA, lngB, lngC, x[14], S22, 0xc33707d6L); /* 26 */
    lngC = gg (lngC, lngD, lngA, lngB, x[ 3], S23, 0xf4d50d87L); /* 27 */
    lngB = gg (lngB, lngC, lngD, lngA, x[ 8], S24, 0x455a14edL); /* 28 */
    lngA = gg (lngA, lngB, lngC, lngD, x[13], S21, 0xa9e3e905L); /* 29 */
    lngD = gg (lngD, lngA, lngB, lngC, x[ 2], S22, 0xfcefa3f8L); /* 30 */
    lngC = gg (lngC, lngD, lngA, lngB, x[ 7], S23, 0x676f02d9L); /* 31 */
    lngB = gg (lngB, lngC, lngD, lngA, x[12], S24, 0x8d2a4c8aL); /* 32 */

    /* Round 3 */
    lngA = hh (lngA, lngB, lngC, lngD, x[ 5], S31, 0xfffa3942L); /* 33 */
    lngD = hh (lngD, lngA, lngB, lngC, x[ 8], S32, 0x8771f681L); /* 34 */
    lngC = hh (lngC, lngD, lngA, lngB, x[11], S33, 0x6d9d6122L); /* 35 */
    lngB = hh (lngB, lngC, lngD, lngA, x[14], S34, 0xfde5380cL); /* 36 */
    lngA = hh (lngA, lngB, lngC, lngD, x[ 1], S31, 0xa4beea44L); /* 37 */
    lngD = hh (lngD, lngA, lngB, lngC, x[ 4], S32, 0x4bdecfa9L); /* 38 */
    lngC = hh (lngC, lngD, lngA, lngB, x[ 7], S33, 0xf6bb4b60L); /* 39 */
    lngB = hh (lngB, lngC, lngD, lngA, x[10], S34, 0xbebfbc70L); /* 40 */
    lngA = hh (lngA, lngB, lngC, lngD, x[13], S31, 0x289b7ec6L); /* 41 */
    lngD = hh (lngD, lngA, lngB, lngC, x[ 0], S32, 0xeaa127faL); /* 42 */
    lngC = hh (lngC, lngD, lngA, lngB, x[ 3], S33, 0xd4ef3085L); /* 43 */
    lngB = hh (lngB, lngC, lngD, lngA, x[ 6], S34,  0x4881d05L); /* 44 */
    lngA = hh (lngA, lngB, lngC, lngD, x[ 9], S31, 0xd9d4d039L); /* 45 */
    lngD = hh (lngD, lngA, lngB, lngC, x[12], S32, 0xe6db99e5L); /* 46 */
    lngC = hh (lngC, lngD, lngA, lngB, x[15], S33, 0x1fa27cf8L); /* 47 */
    lngB = hh (lngB, lngC, lngD, lngA, x[ 2], S34, 0xc4ac5665L); /* 48 */
   
    /* Round 4 */
    lngA = ii (lngA, lngB, lngC, lngD, x[ 0], S41, 0xf4292244L); /* 49 */
    lngD = ii (lngD, lngA, lngB, lngC, x[ 7], S42, 0x432aff97L); /* 50 */
    lngC = ii (lngC, lngD, lngA, lngB, x[14], S43, 0xab9423a7L); /* 51 */
    lngB = ii (lngB, lngC, lngD, lngA, x[ 5], S44, 0xfc93a039L); /* 52 */
    lngA = ii (lngA, lngB, lngC, lngD, x[12], S41, 0x655b59c3L); /* 53 */
    lngD = ii (lngD, lngA, lngB, lngC, x[ 3], S42, 0x8f0ccc92L); /* 54 */
    lngC = ii (lngC, lngD, lngA, lngB, x[10], S43, 0xffeff47dL); /* 55 */
    lngB = ii (lngB, lngC, lngD, lngA, x[ 1], S44, 0x85845dd1L); /* 56 */
    lngA = ii (lngA, lngB, lngC, lngD, x[ 8], S41, 0x6fa87e4fL); /* 57 */
    lngD = ii (lngD, lngA, lngB, lngC, x[15], S42, 0xfe2ce6e0L); /* 58 */
    lngC = ii (lngC, lngD, lngA, lngB, x[ 6], S43, 0xa3014314L); /* 59 */
    lngB = ii (lngB, lngC, lngD, lngA, x[13], S44, 0x4e0811a1L); /* 60 */
    lngA = ii (lngA, lngB, lngC, lngD, x[ 4], S41, 0xf7537e82L); /* 61 */
    lngD = ii (lngD, lngA, lngB, lngC, x[11], S42, 0xbd3af235L); /* 62 */
    lngC = ii (lngC, lngD, lngA, lngB, x[ 2], S43, 0x2ad7d2bbL); /* 63 */
    lngB = ii (lngB, lngC, lngD, lngA, x[ 9], S44, 0xeb86d391L); /* 64 */

    lngState[0] = (lngState[0] + lngA) & 0xFFFFFFFFL;
    lngState[1] = (lngState[1] + lngB) & 0xFFFFFFFFL;
    lngState[2] = (lngState[2] + lngC) & 0xFFFFFFFFL;
    lngState[3] = (lngState[3] + lngD) & 0xFFFFFFFFL;

    x = decode (pad);
  }

  private static long ff(long lngA, long lngB, long lngC, long lngD, long lngX, long lngS, long lngAC) {
    lngA = (lngA + (lngB & lngC | (~lngB) & lngD) + lngX + lngAC) & 0xFFFFFFFFL;
    lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
    lngA = (lngA + lngB) & 0xFFFFFFFFL;
    return(lngA);
  }

  private static long gg(long lngA, long lngB, long lngC, long lngD, long lngX, long lngS, long lngAC) {
    lngA = (lngA +  (lngB & lngD | lngC & ~lngD) + lngX + lngAC) & 0xFFFFFFFFL;
    lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
    lngA = (lngA + lngB) & 0xFFFFFFFFL;
    return(lngA);
  }

 private static long hh(long lngA, long lngB, long lngC, long lngD, long lngX, long lngS, long lngAC) {
    lngA = (lngA + (lngB ^ lngC ^ lngD) + lngX + lngAC) & 0xFFFFFFFFL;
    lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
    lngA = (lngA + lngB) & 0xFFFFFFFFL;
    return(lngA);
  }

 private static long ii(long lngA, long lngB, long lngC, long lngD, long lngX, long lngS, long lngAC) {
    lngA = (lngA + (lngC ^ (lngB | ~lngD)) + lngX + lngAC) & 0xFFFFFFFFL;
    lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
    lngA = (lngA + lngB) & 0xFFFFFFFFL;
    return(lngA);
  }


  private void update(char bytInput[], long lngLen) {
    int index = (int)( this.lngByteCount % 64);
    int i = 0;
    this.lngByteCount += lngLen;
    int partLen = 64 - index;
    if (lngLen >= partLen) {
      for (int j = 0; j < partLen; j++) {
        this.bytBuffer[j + index] = bytInput[j];
      }
      transform (this.lngState, this.bytBuffer);

      for (i = partLen; i + 63 < lngLen; i += 64) {
       for (int j = 0; j<64; ++j) {
          this.bytBuffer[j] = bytInput[j+i]; 
        }    
        transform (this.lngState, this.bytBuffer);
      }
      index = 0;
    }
    else {
      i = 0;
    }
    for (int j = 0; j < lngLen - i; j++) {  
      this.bytBuffer[index + j] = bytInput[i + j];
    }

  }

  public void md5final() {
    char bytBits[] = new char[8];
    int index, padLen;
    long bits = this.lngByteCount * 8;
    
    bytBits[0] = (char) (bits & 0xffL);
    bytBits[1] = (char) ((bits >>> 8) & 0xffL);
    bytBits[2] = (char) ((bits >>> 16) & 0xffL);
    bytBits[3] = (char)((bits >>> 24) & 0xffL);
    bytBits[4] = (char)((bits >>> 32) & 0xffL);
    bytBits[5] = (char)((bits >>> 40) & 0xffL);
    bytBits[6] = (char)((bits >>> 48) & 0xffL);
    bytBits[7] = (char)((bits >>> 56) & 0xffL);

    index = (int) this.lngByteCount%64;
    if (index < 56 ) {
      padLen = 56 - index;
    }
    else {
      padLen = 120 - index;
    }
    update(pad, padLen);
    update(bytBits, 8);        
  }

  private StringBuffer toHexString() {
    long myByte = 0;
    StringBuffer mystring = new StringBuffer();
    for (int j = 0; j < 4; ++j) {
      for (int i = 0; i < 32; i += 8) {
         myByte = (this.lngState[j] >>> i) & 0xFFL;
         if (myByte < 16) {
           mystring.append("0" + Long.toHexString(myByte));
         }
         else {
           mystring.append(Long.toHexString(myByte)); 
         }
      }
    }
    return(mystring);
  }

  public void init() {
    this.lngByteCount = 0;
    this.lngState[0] = 1732584193L;
    this.lngState[1] = 4023233417L;
    this.lngState[2] = 2562383102L;
    this.lngState[3] = 271733878L;
  }

  public static void main (String args []) throws IOException {
    String strTestData;
    char chrTestData[] = new char[64];
    MD5 md5Test = new MD5();

    md5Test.init();
    strTestData = new String("привет");
    chrTestData = strTestData.toCharArray();    
    md5Test.update(chrTestData,chrTestData.length);    
    md5Test.md5final();
    System.out.println("MD5 (" + strTestData +") = " + md5Test.toHexString() );
  }
}


Добавлено через 1 минуту и 58 секунд
4EJIOBEK, Я проверил, чарЭт нормально работает, а вот индексОф нет!!!
PM MAIL ICQ GTalk   Вверх
zolim
Дата 27.5.2009, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.3.2009
Где: Uzbekistan, Tashk ent

Репутация: нет
Всего: нет



Nobody knows how to solve the problem?  smile 
PM MAIL ICQ GTalk   Вверх
Samotnik
Дата 27.5.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



google =>>>  nativetoascii
это готовая тулза (см папку с Java)   с помощью нее перегони русские символы,и вставляй полученный код, а не русские символы
PM MAIL   Вверх
4EJIOBEK
Дата 27.5.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 26.3.2007

Репутация: нет
Всего: 4



как вариант попробуй передавать строки для кодирования не как массив char, а массивом byte. 
PM MAIL ICQ   Вверх
math64
Дата 27.5.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Как раз System.out.println(a.charAt(129)) работает неправильно. Ты смотришь результат println() в консоли, а там кодировка Cp866, а исходник у тебя в Cp1251. А вообще создавать строку из неправильных байтов неправильно.
Так немного правильнее, но всё равно неправильно (некоторые байты недействительны в кодировке Cp1251):
Код

class Temp {
    public static void main(String args[]) {
        byte ascii[] = new byte[256];
        for (int i = 0; i < 256; i++)
          ascii[i] = (byte)i;
        String a="";
        try {
            a=new String(ascii, "Cp1251");
            System.out.println(a.charAt(193));
            System.out.println(a.indexOf("Б"));
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

(результат сохрнить в файл и смотреть в кодировке 1251)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.