Главная Контакты


  На сайте

  Java, JavaScript
  Документация Perl
  Документация PHP
  Документация ASP
  Новости сайта
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C
 


Java: русские буквы и не только...


JNI (Java Native Interface) - это стандарт по взаимодействию с C/C++-ным кодом. Как и следовало ожидать, на этом водоразделе тоже происходит столкновение 8-ми и 16-битовых кодировок. Большинство C/C++-ных программ пишется без учёта Unicode, многие программисты даже не знают о нём. Я сам, за 7 лет писательства на C/C++, пока не начал писать на Java, про Unicode знал только по наслышке. Большинство строковых операций в C/C++ сделаны для 8-битового сишного типа char. В принципе, есть некоторые подвижки в этом направлении, в частности для Windows NT можно откомпилировать код, который будет взаимодействовать с Unicode-вариантами Win32 API, но, к сожалению, этого часто недостаточно.

Таким образом главная задача - получить тип char* из типа jstring (JNI-шное отображение String) и наоборот. Практически во всех описаних и примерах JNI для этого используется пара функций GetStringUTFChars/ReleaseStringUTFChars. Коварные буржуины и здесь приготовили засаду - эти функции формируют массив байтов по стандарту UTF, который соответствует ожидаемому только для ASCII-символов (первых 128 значений). Русские буквы опять в пролёте. Сишный char очень хорошо ложится на Java-овский тип byte, но при этом возникает загвоздка в виде ноль-символа. Его нужно добавлять при преобразовании byte[]->char* и учитывать при обратном преобразовании. Делать это на C/C++ неудобно, потому лучше всего сделать максимум возможного на Java. Пример: // Получение сишной строки public static byte[] getCString(String s) { return (s+' ').getBytes(); } public void action(String msg) throws java.io.IOException { int res = nAction( getCString(msg) ); if( res!=0 ) throw new java.io.IOException ( getErrorString(res) ); } private String getErrorString(int error) { byte[] buf = new byte[256]; int len = nGetErrorString(error,buf); return new String(buf,0,len); } private native int nAction(byte[] msg); private native int nGetErrorString (int error,byte[] msg); ... JNIEXPORT jint JNICALL Java_Test_nAction (JNIEnv *env, jobject obj, jbyteArray msg) { jint res; jbyte *bmsg = (*env)->GetByteArrayElements(env,msg,NULL); printf(bmsg); res = do_something(bmsg); (*env)->ReleaseByteArrayElements(env,msg,bmsg,JNI_ABORT); return res; } JNIEXPORT jint JNICALL Java_Test_nGetErrorString (JNIEnv *env, jobject obj, jint error, jbyteArray msg) { jbyte *bmsg = (*env)->GetByteArrayElements(env,msg,NULL); jsize sz = (*env)->GetArrayLength(env,msg); jint len; get_error_string( error,bmsg,sz ); len = strlen(bmsg); (*env)->ReleaseByteArrayElements(env,msg,bmsg,0); return len; } Тут используется преобразование символов по умолчанию, что вполне естественно при взаимодействиях с системным API. Если же Вам необходима определённая кодовая страница, соответственно нужно добавить её название. GUI (AWT, Swing)

Многие связывают неправильный вывод русских букв с неправильной установкой шрифта. Мне кажется, это связанно с тяжким опытом программирования на Windows 3.x, где основная причина действительно была в этом. В Java всё сложнее и редко действительно связанно со шрифтами. Я не разбирался со специфическими настройками броузеров, т.к. ещё не писал апплетов, только приложения, но думаю в последних версиях в этом плане всё нормально.

Где же действительно лежат наибольшие подводные камни? В основном это связанно с неправильной перекодировкой символов. Часть этих проблем и методы их решения описаны выше. Если у Вас все преобразования выполняются корректно, и для вывода используется шрифт Unicode, то есть очень большой шанс, что Ваша программа будет работать правильно.

Другие статьи по теме:

- учим java. этап первый: подготовительный
- Java. объектно-ориентированное программирование с интерфейсами
- революция java
- Java: управление ресурсами
- поисковая оптимизация как вид деятельности


Голосование:
Чего Вы хотели бы видеть больше на сайте?

Статей, документации
Скриптов
Программ для вебмастера
Я не знаю



Другие голосования

Обмен кнопочками:



Приглашаем Вас обменяться кнопочками! Обращайтесь к администратору.


Новые статьи:


Наши партнеры:





2006-2024 © SMTI.RU
Главная страница | Связаться с нами