2011-11-25 119 views
1

我在unix中將wstring轉換爲jstring時出現問題,因爲Linux中wchar_t的大小爲4個字節(而不是2個字節,比如windows,因此我無法使用wchar_t轉換爲一個jchar)。在Linux上將wstring轉換爲jstring

任何人都可以幫助我嗎?

感謝, 禮

回答

2

你必須使用類似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_tstd::u16string,則可以使用uint16_t爲基本字符類型和std::basic_string<uint16_t>std::vector<uint16_t>所得到的容器。

+0

謝謝。所以這個方法將一個wstring轉換爲一個utf16字符串,對吧?那麼,我應該如何從這個wstring中創建一個jstring? – RezaPlusPlus

+0

@RezaPlusPlus:* input *是一個不透明的C++寬字符串,該函數的* output *是一個定義良好的UTF-16BE字符串。我不知道jstrings是什麼,但你應該能夠以某種方式將結果的第一個元素的指針傳遞給jstring。 –

+0

順便說一句,是std :: u16string標準STL? – RezaPlusPlus