2017-02-25 2 views
1

J'ai un littéral de chaîne Java avec des caractères Unicode qui doit être transféré dans un littéral de chaîne C, qui est chargeable avec JNIEnv.NewString.Échapper une chaîne Java pour le code JNI

Malheureusement, la méthode ci-dessus prend un pointeur vers un tableau de unsigned short (jchar). J'ai essayé d'utiliser le code comme suit:

unsigned short str[] = {65, 66, 67}; 
jstring java_str = (*env)->NewString(env, str, 3); 

Cependant, cela prend beaucoup de place, n'est pas lisible par l'homme, et il est difficile à maintenir.

Existe-t-il un moyen de convertir un littéral de chaîne en unsigned short[] en C, tout en continuant à utiliser les caractères UTF-16 de Java?

Cette échappatoire peut-elle être effectuée par programme? c'est-à-dire convertir un java.lang.String en un littéral de chaîne qui fonctionnerait dans le code source C.

+0

C possède des chaînes étendues, malheureusement, il est spécifié dans l'implémentation quels jeux de caractères ils utilisent, sauf si vous pouvez utiliser C11 –

+0

Un littéral de chaîne C est en lecture seule. Mais essayez-vous de générer du code source C? –

+0

Je préférerais ne pas récupérer une tonne de chaînes manuellement, donc ce serait bien de générer les littéraux. Si ce n'est pas possible, je peux leur échapper manuellement. – konsolas

Répondre

2

Si vous pouvez utiliser C11 et GCC, vous pouvez utiliser la nouvelle char16_t qui sera UTF-16 dans GCC:

#include <uchar.h> 

#ifndef __STDC_UTF_16__ 
#error "char16_t not UTF-16" 
#endif 

... 
    char16_t my_string[] = u"abc"; 
    jstring java_str = (*env)->NewString(env, str, 3); 

Et compiler avec gcc -std=c11

Mais de toute façon, la plupart du temps on utilise simplement des chaînes ASCII et que l'on peut simplement utiliser le

jstring java_str = (*env)->NewStringUTF(env, "abc"); 

qui suppose que la chaîne est en UTF-8 modifié le codage (par exemple UTF-16 surrog les paires man sont codées séparément en UTF-8; et null-terminé). Comme ASCII est un sous-ensemble de UTF-8, il est plutôt utilisable pour les chaînes ASCII.

+0

Ceci est une utilisation appropriée et opportune de 'NewStringUTF' car les chaînes sont des chaînes littérales dans le code source et on peut savoir que le compilateur reçoit le bon jeu de caractères source et que le jeu de caractères peut être sélectionné pour être compatible avec UTF modifié -8 pour certaines plages de codes (y compris U + 0000 à D + D7FF). Un commentaire de code source à cet effet est conseillé. L'ensemble des jeux de caractères applicables est encore plus grand si vos données sont limitées aux commandes C0 et au Latin de base (U + 0000 à U + 007F). –

+0

Ce format de chaîne de caractères C11 semble être ce que je cherchais. Merci! – konsolas

1

Ce que vous cherchez n'est pas appelé échapper.

Il semble que ce que vous voulez faire est de spécifier une chaîne de caractères en C, en utilisant un littéral de chaîne lisible par l'homme, et de pouvoir passer à JNI NewString(). Vous devrez lire sur wchar_t.

Voir What is a "wide character string" in C language? et https://en.wikibooks.org/wiki/C_Programming/C_Reference/wchar.h

Ce que vous devez faire est de définir vos chaînes littérales comme wchar_t (en utilisant la notation « L » a expliqué dans les postes ci-dessus), puis écrire une fonction de conversion qui convertit ces tableaux de wchar_t à des tableaux de jchar.

Malheureusement, la norme C ne définit pas la mise en œuvre précise de wchar_t, et laisse la place en place aux fournisseurs de compilateur C pour faire comme ils s'il vous plaît, donc il y a une chance que votre compilateur C ne traite pas wchar_t comme 16- quantité de bits Dans ce cas, votre fonction de conversion ne pourra pas simplement convertir un tableau de wchar_t en un tableau de jchar, et il devra les convertir un par un à la place. C'est un peu compliqué, mais faisable. Bonne chance!