2017-02-25 3 views
1

유니 코드 문자가있는 Java 문자열 리터럴을 C 문자열 리터럴로 전송해야합니다.이 문자열은 JNIEnv.NewString으로로드 할 수 있습니다.JNI 코드 용 Java 문자열 이스케이프

위의 메서드는 unsigned short (jchar)의 배열에 대한 포인터를 사용합니다. 나는 다음과 같은 코드를 사용해 보았습니다 :

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

그러나 이것은 많은 공간이 필요하고 사람이 읽을 수 없으며 유지하기 어렵습니다.

문자열 리터럴을 C에서 unsigned short[]으로 변환하는 방법이 있습니까? 그렇지만 여전히 Java의 UTF-16 문자를 사용할 수 있습니까?

이 탈출을 프로그래밍 방식으로 수행 할 수 있습니까? 즉 java.lang.String을 C 소스 코드에서 작동 할 문자열 리터럴로 변환합니다.

+0

C에는 넓은 문자열이 있지만 불행하게도 C11 –

+0

을 사용할 수있는 경우를 제외하고 구현에서 사용하는 문자 집합은 읽기 전용입니다. 하지만 C 소스 코드를 생성하려고합니까? –

+0

필자는 기본적으로 수천 개의 문자열을 수동으로 추출하지 않으므로 리터럴을 생성하는 것이 좋습니다. 그게 가능하지 않으면 나는 그들을 수동으로 벗어날 수 있습니다. – konsolas

답변

2

는 C11 및 GCC를 사용할 수있는 경우에, 당신은 GCC에 UTF-16이 될 새로운 char16_t 사용할 수 있습니다

#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); 

을 어쨌든 gcc -std=c11

하지만, 컴파일 대부분의 시간 하나는 ASCII 문자열을 사용하고 해당 하나 단순히 문자열 (수정 UTF-8 인코딩, 즉 UTF-16 surrog 있다고 가정합니다

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

을 사용할 수 있습니다 ate 쌍은 UTF-8로 별도로 인코딩됩니다. 널 종료 됨). ASCII는 UTF-8의 서브 세트이므로 ASCII 문자열에 대해서는 오히려 사용 가능합니다.

+0

문자열이 소스 코드의 리터럴 문자열이기 때문에 컴파일러에 정확한 소스 문자 집합이 전달되고 실행 문자 집합이 수정 된 UTF와 호환되도록 선택할 수 있으므로 적절하고 편리한 'NewStringUTF'를 사용합니다 -8 코드 포인트의 특정 범위 (U + 0000 - D + D7FF 포함). 그 효과에 대한 소스 코드 주석이 좋습니다. 데이터가 C0 컨트롤 및 기본 라틴어 (U + 0000 ~ U + 007F)로 제한되는 경우 적용 가능한 문자 세트 세트가 더 커집니다. –

+0

이 C11 문자열 리터럴 형식이 내가 찾고있는 것 같습니다. 감사! – konsolas

1

찾고있는 것이 이스케이프 처리되지 않습니다.

당신이 원하는 것은 사람이 읽을 수있는 문자열 리터럴을 사용하여 C로 문자열을 지정하고이를 JNI NewString()에 전달할 수있는 것으로 보입니다.

wchar_t에서 읽어야합니다.

는 (이하 "L"표기는 위의 글에서 설명을 사용하여) wchar_t로 문자열 리터럴을 정의하고 wchar_t의 이러한 배열을 변환하는 변환 함수를 작성하는 것입니다 필요가 무엇 What is a "wide character string" in C language?https://en.wikibooks.org/wiki/C_Programming/C_Reference/wchar.h

를 참조하십시오 배열은 jchar입니다.

불행하게도, C 표준은 wchar_t의 정확한 구현을 정의하지 않고, 대신하시기 바랍니다 그들로 할 C 컴파일러 공급 업체에 그것을 잎, 그래서 당신의 C 컴파일러는 16로 wchar_t을 취급하지 않는 가능성이 있습니다 비트 수량. 이 경우 변환 함수는 wchar_t의 배열을 jchar의 배열로 변환 할 수 없으며 대신 하나씩 변환해야합니다. 번거롭기는하지만 할 수있는 일입니다. 행운을 빕니다!