जावा स्ट्रिंग को जेएनआई कोड में एक वास्तविक यूटीएफ -8 बाइट सरणी में परिवर्तित करने का कोई आसान तरीका है?जावा में वास्तविक यूटीएफ -8 अक्षरों को प्राप्त करना जेएनआई
दुर्भाग्य से GetStringUTFChars() लगभग क्या आवश्यक है लेकिन काफी नहीं है, यह एक "संशोधित" यूटीएफ -8 बाइट अनुक्रम देता है। मुख्य अंतर यह है कि एक संशोधित यूटीएफ -8 में कोई भी शून्य वर्ण नहीं होता है (इसलिए आप एक एएनएसआई सी नल टर्मिनेटेड स्ट्रिंग का इलाज कर सकते हैं) लेकिन एक और अंतर यह प्रतीत होता है कि यूनिकोड पूरक पूरक जैसे इमोजी का इलाज किया जाता है।
यू + 1 एफ 604 "खुले मुंह और स्माइलिंग आइज़ के साथ स्माइलिंग फेस" जैसे एक चरित्र को सरोगेट जोड़ी (दो यूटीएफ -16 वर्ण यू + डी 83 डी यू + डीई 04) के रूप में संग्रहीत किया जाता है और इसमें 4-बाइट यूटीएफ -8 समकक्ष होता है F0 की 9 फ 98 84, और कहा कि बाइट क्रम कि मैं मिलता है अगर मैं UTF-8 में स्ट्रिंग परिवर्तित जावा में:
char[] c = Character.toChars(0x1F604);
String s = new String(c);
System.out.println(s);
for (int i=0; i<c.length; ++i)
System.out.println("c["+i+"] = 0x"+Integer.toHexString(c[i]));
byte[] b = s.getBytes("UTF-8");
for (int i=0; i<b.length; ++i)
System.out.println("b["+i+"] = 0x"+Integer.toHexString(b[i] & 0xFF));
कोड ऊपर प्रिंट निम्नलिखित:
ग [ 0] = 0xd83d सी [1] = 0xde04 बी [0] = 0xf0 बी [1] = 0x9F ख [2] = 0x98 ख [3] = 0x84
हालांकि, अगर मैं एक देशी JNI विधि में पारित और GetStringUTFChars() फोन 'एस' मैं 6 बाइट्स मिलता है।
JNIEXPORT void JNICALL Java_EmojiTest_nativeTest(JNIEnv *env, jclass cls, jstring _s)
{
const char* sBytes = env->GetStringUTFChars(_s, NULL);
for (int i=0; sBytes[i]!=0; ++i)
fprintf(stderr, "%d: %02x\n", i, sBytes[i]);
env->ReleaseStringUTFChars(_s, sBytes);
return result;
}
0: किराए की जोड़ी पात्रों में से प्रत्येक एक 3-बाइट क्रम स्वतंत्र रूप से करने के लिए परिवर्तित किया जा रहा है एड 1: a0 2: bd 3: एड 4: B8 5: 84
Wikipedia UTF-8 article सुझाव देता है कि GetStringUTFChars() वास्तव में यूटीएफ -8 के बजाय सीईएसयू -8 लौटाता है।
CFStringRef str = CFStringCreateWithCString(NULL, path, kCFStringEncodingUTF8);
CFURLRef url = CFURLCreateWithFileSystemPath(NULL, str, kCFURLPOSIXPathStyle, false);
मुझे लगता है मैं एक बाइट [] के बजाय एक स्ट्रिंग लेने के लिए अपने सभी JNI तरीकों को बदल सकता है लगता है और UTF कार्य करें: बदले में ऐसा इसलिए है क्योंकि यह एक वैध UTF-8 अनुक्रम नहीं है दुर्घटना करने के लिए अपने देशी मैक कोड का कारण बनता है -8 जावा में रूपांतरण लेकिन यह थोड़ा बदसूरत लगता है, क्या कोई बेहतर समाधान है?