在Linux上将wstring转换为jstring [英] Converting a wstring to jstring on Linux

查看:801
本文介绍了在Linux上将wstring转换为jstring的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在unix中将wstring转换为jstring时出现问题,因为linux上的wchar_t的大小为4个字节(不像2个字节,因为我不能使用wchar_t转换为jchar)。

I'm having problems converting a wstring to jstring in unix, as the size of wchar_t on linux in 4 bytes (not 2 bytes like windows and thus I cannot use the casting of a wchar_t to a jchar).

任何人都可以帮助我吗?

Can anyone please help me with that?

谢谢,
Reza

Thanks, Reza

推荐答案

你必须使用类似 iconv()的东西,因为C ++宽字符串有一个不透明的(读取:未知)编码,而Java期望UTF16。试试这个:

You have to use something like iconv(), because C++ wide strings have an opaque (read: unknown) encoding, while Java expects UTF16. Try this:

#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> 作为生成的容器。

If you don't have char16_t and std::u16string, you can use uint16_t as the basic character type and std::basic_string<uint16_t> or std::vector<uint16_t> as the resulting container.

这篇关于在Linux上将wstring转换为jstring的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆