gpt4 book ai didi

java - 在 Linux 上将 wstring 转换为 jstring

转载 作者:行者123 更新时间:2023-11-30 04:31:18 25 4
gpt4 key购买 nike

我在 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_tstd::u16string , 你可以使用 uint16_t作为基本字符类型和 std::basic_string<uint16_t>std::vector<uint16_t>作为生成的容器。

关于java - 在 Linux 上将 wstring 转换为 jstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8272512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com