- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 unix 中将 wstring 转换为 jstring 时遇到问题,因为 linux 上 wchar_t 的大小为 4 个字节(不像 Windows 是 2 个字节,因此我无法将 wchar_t 转换为 jchar)。
有人可以帮我吗?
谢谢,礼萨
最佳答案
你必须使用像 iconv()
这样的东西,因为 C++ 宽字符串具有不透明(读取:未知)编码,而 Java 需要 UTF16。试试这个:
#include <iconv.h>
#include <string>
#include <vector>
#include <iostream>
std::u16string convert(std::wstring s)
{
iconv_t cd = iconv_open("UTF-16BE", "WCHAR_T");
if (cd == iconv_t(-1))
{
std::cout << "Error while initializing iconv: " << errno << std::endl;
iconv_close(cd);
return std::u16string();
}
std::size_t n = s.length() * 2 + 1; // Each character might use up to two CUs.
const std::size_t norig = n;
std::size_t m = s.length() * sizeof(std::wstring::value_type);
std::vector<char16_t> obuf(n);
char * outbuf = reinterpret_cast<char*>(obuf.data());
const char * inbuf = reinterpret_cast<const char*>(&s[0]);
const std::size_t ir = iconv(cd, const_cast<char**>(&inbuf), &m, &outbuf, &n);
if (ir == std::size_t(-1))
{
std::cout << "Error while converting with iconv(): " << errno << ":" << EINVAL << ", left " << m
<< ", written " << std::dec << norig - n << " bytes." << std::endl;
iconv_close(cd);
return std::u16string();
}
iconv_close(cd);
return std::u16string(obuf.data(), (norig - n)/sizeof(std::u16string::value_type));
}
如果你没有 char16_t
和 std::u16string
, 你可以使用 uint16_t
作为基本字符类型和 std::basic_string<uint16_t>
或 std::vector<uint16_t>
作为生成的容器。
关于java - 在 Linux 上将 wstring 转换为 jstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8272512/
我的 Java 类中有一个字符串变量: public class myclass { protected final String file; myclass(String f) {
JNIEXPORT int JNICALL Java_com_ndkfoo_test_GL2JNILib_step2(JNIEnv * env, jobject obj, jstring fileP
我一直在尝试调用具有以下签名的 C 函数 int changeFoo(L_TCHAR* pszFileSrc){....} 在我的 JNI 调用中,我的方法如下所示: JNIEXPORT jint J
当我尝试将 WCHAR_T* 传递给 java 方法时,应用程序崩溃了。 我有 WCHAR_T* 变量及其长度。 我知道如何将它转换为 jstring 以调用 java 方法。 我的 C++ 代码:
这是我的 JNI C 代码: JNIEXPORT jint JNICALL Java_org_avuna_httpd_util_CLibJNI_bind(JNIEnv * this, jclass c
C++ 端看起来像这样: JNIEXPORT jint JNICALL Java_Myclass_showMessage (JNIEnv* env, jobject obj, jstring titl
我正在调用一个返回字符串的 Java 函数: QAndroidJniObject obj = QAndroidJniObject::callStaticObjectMethod("HelloJava"
我对JNI知之甚少|以及内部的处理方式 JNI环境。我有一个简单的问题。 我在 Java 中有一个方法调用 JNI方法并传递一个 String在参数中。 JNI方法在 jstring 中接受该字符串对
#include #include "Package_MyTester.h" jstring Java_Package_MyTester_NMethod (JNIEnv *env, jobject
假设在 C++ 端,我的函数采用类型为 jstring 的变量,名为 myString。我可以将其转换为 ANSI 字符串,如下所示: const char* ansiString = env->Ge
我正在使用下面的 JNI 代码将 jchararray 转换为 jstring,但我在 Linux 中只获得第一个字符。 char *carr =(char*)malloc(length+1); (
我需要在我的 native 代码中使用 const char * 所以,我将 java 端的参数作为 jstring 并使用以下语句 JNIEXPORT int JNICALL JNIFUNCTION
我正在尝试将 wstring 从我的 cpp 代码转换为 jstring。 我知道有一个名为 NewStringUTF 的方法可以从 std::string 获取 jstring(当然是在从该字符串获
我的 cpp 代码包含一个我希望转换为 const char* 的 jni 函数。这是我正在使用的代码 extern "C" { void Java_com_sek_test_JNITest_prin
我正在使用 basic_string类型并需要将其转换为 jstring 以通过 JNI 层。我想知道最好的方法是什么。我有一个函数可以给我 std::string来 self 的 basic_str
我正在尝试将 C++ std::string 转换为 jstring 并将其返回。这将很容易 JNIEnv*->NewStringUTF(stdString.c_str()) 但问题是我正在转换的字符
我通过使用 JNI 将一个 URL 字符串从 Java 传递到 C 代码作为 jstring 数据类型。我的库方法需要一个 char * 作为 url。 如何在 char * 中转换 jstring
我正在尝试为现有 C++ 代码创建 Java 接口(interface)。 我的功能之一与此类似: JNIEXPORT jstring JNICALL Java_com_testproxy_Nativ
我们最近从 Jerkson 切换到 json4s,很快发现这两个库的默认反序列化行为大相径庭。 我们遇到的一个问题是我们有时会收到 json 输入,其中数字字段表示为字符串而不是数字 //exampl
我在 unix 中将 wstring 转换为 jstring 时遇到问题,因为 linux 上 wchar_t 的大小为 4 个字节(不像 Windows 是 2 个字节,因此我无法将 wchar_t
我是一名优秀的程序员,十分优秀!