2016-04-13 5 views
1

ドイツ語の文字列をiconvを使用してUTF-16に変換しようとしていますが、無駄です。ここではそのためのコードです:iconvを使用してエンコードを変換できません

#include <iconv.h> 
#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

using namespace std; 

const size_t BUF_SIZE=1024; 

class IConv { 
     iconv_t ic_; 
public: 
     IConv(const char* to, const char* from) 
      : ic_(iconv_open(to,from)) { } 
     ~IConv() { iconv_close(ic_); } 

     bool convert(char* input, char* output, size_t& out_size) { 
      size_t inbufsize = strlen(input)+1; 
      return iconv(ic_, &input, &inbufsize, &output, &out_size); 
     } 
}; 

int main(void) 
{ 
    char str1[BUF_SIZE] = "tägelîch"; 
    char str2[BUF_SIZE] = "something else"; 
    IConv ic("en_US.UTF-8","UTF16LE"); 
    bool ret; 

    cout << str1 << endl; 
    size_t outsize = BUF_SIZE; //you will need it 
    ret = ic.convert(str1, str2, outsize); 
    if (ret == false) { 
     cout << "iconv failed: " << errno << endl; 
     return -1; 
    } 
    cout << str2 << endl; 
} 

出力:エンコーディングからタイプがISO-8859-1に変更された場合

$ ./a.out 
tägelîch 
something else 

が、結果は同じです。一方

は、iconvのユーティリティは、コマンドプロンプトから正常に動作します:

$ echo "TägelîcH" | iconv -f "ISO-8859-1" -t UTF-16LE 
T▒▒gel▒▒cH 

iconv --list

ISO-8859-1UTF-16LEの両方がサポートされていることを示しています。私は何が欠けていますか?

C++はこの動作の原因になりますか?

ありがとうございます!

答えて

1

is not C++。

コードには多くの問題があります。

1)私が間違っていない場合は、コードをout-codeで切り替えます。 ic("en_US.UTF-8","UTF16LE")(およびiconv_open(to,from))を「UTF16LE」から「en_US.UTF-8」に変換することをお勧めします。

2)お使いのプラットフォームではわかりませんが、Debian iconvは "en_US.UTF-8"エンコードをサポートしていません。 iconv_open(to,from)リターンiconv_t(-1)、エラー値

4)あなたは変換からboolを返すが、size_tを返すiconv()かどうかをテストしません)お使いのプラットフォームでiconv

3それをサポートしているかどうかを確認するためにiconv --listてみてください。 (私はよくunderstan場合、エラーなし)エラーの場合には、ブール値に変換し、iconv()戻りsize_t(-1)は、あなたがconvert()に渡された三番目の引数の値をテストしていない)

5をtrueになります。あなたは「tägelîch」にstr1を初期化するとき、あなたはISO-8859-1ではなく、UTF-8

でそれを初期化)

6は、関数を呼び出した後にゼロにする必要があります(または入力ストリームの一部は、未変換です)

簡単に言えば、間違っていないと、iconvでサポートされているエンコーディングのリストにないto-encodingを渡します。 IConvクラスのコンストラクタはcv_iconv_t(-1)(エラー値)で初期化します。 convert()メソッドを呼び出すと、iconv()が失敗し、によってtrue(エラー値なし)として返されるsize_t(-1)(エラー値)が返されます。

次のコードは完璧ではありませんが、私はそれはあなた

#include <iconv.h> 
#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

using namespace std; 

const size_t BUF_SIZE=1024; 

class IConv { 

    iconv_t ic_; 

    public: 
     IConv (const char* to, const char* from) 
      : ic_(iconv_open(to,from)) { 
       if (iconv_t(-1) == ic_) 
       throw std::runtime_error("error from iconv_open()"); 
      } 

     ~IConv() 
     { if (iconv_t(-1) != ic_) iconv_close(ic_); } 

     bool convert (char* input, char* output, size_t& out_size) { 
      size_t inbufsize = strlen(input)+1; 
      return 
        (size_t(-1) 
         != iconv(ic_, &input, &inbufsize, &output, &out_size)) 
       && (0U == inbufsize); 
     } 
}; 

int main(void) 
{ 
    char str1[BUF_SIZE] = "tägelîch"; 
    char str2[BUF_SIZE] = "something else"; 
    IConv ic("UTF16LE", "ISO_8859-1"); 
    bool ret; 
    size_t outsize = BUF_SIZE; 

    ret = ic.convert(str1, str2, outsize); 
    if (ret == false) { 
     cout << "iconv failed: " << errno << endl; 
    } 
    else { 
     cout << "outsize[" << outsize << "]\n"; 
     cout << "str1[" << str1 << "]\n"; 
     cout << "str2[" << str2 << "]\n"; 

     for (int i = 0 ; i < (BUF_SIZE - outsize) ; ++i) 
      if (str2[i]) 
      cout << "str2[" << i << "]=[" << int(str2[i]) << "](" 
       << str2[i] << ")\n"; 
    } 

    return ret ? EXIT_SUCCESS : EXIT_FAILURE; 
} 

p.s:私の悪い英語のため申し訳ありませんが役立つことを願って。

+0

コードの誤りを指摘してくれてありがとう。今はうまくいく。 – Maddy

関連する問題