1
我在unix中將wstring轉換爲jstring時出現問題,因爲Linux中wchar_t的大小爲4個字節(而不是2個字節,比如windows,因此我無法使用wchar_t轉換爲一個jchar)。在Linux上將wstring轉換爲jstring
任何人都可以幫助我嗎?
感謝, 禮
我在unix中將wstring轉換爲jstring時出現問題,因爲Linux中wchar_t的大小爲4個字節(而不是2個字節,比如windows,因此我無法使用wchar_t轉換爲一個jchar)。在Linux上將wstring轉換爲jstring
任何人都可以幫助我嗎?
感謝, 禮
你必須使用類似iconv()
,因爲C++寬字符串具有不透明(讀:未知)編碼,而Java預計UTF-16。試試這個:
#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>
所得到的容器。
謝謝。所以這個方法將一個wstring轉換爲一個utf16字符串,對吧?那麼,我應該如何從這個wstring中創建一個jstring? – RezaPlusPlus
@RezaPlusPlus:* input *是一個不透明的C++寬字符串,該函數的* output *是一個定義良好的UTF-16BE字符串。我不知道jstrings是什麼,但你應該能夠以某種方式將結果的第一個元素的指針傳遞給jstring。 –
順便說一句,是std :: u16string標準STL? – RezaPlusPlus