从std :: vector <char>转换为wchar_t * </char>

时间:2010-06-29 17:31:33

标签: c++ stl

我正在尝试使用TagLib(1)读取ID3帧及其值,并使用CLucene(2)对其进行索引。前者将帧ID返回为std::vector<char>(3),后者将字段名称写为tchar* [wchar_t*在Linux中](4)。我需要在两者之间建立联系。如何通过STL从std::vector<char>转换为wchar_t*?谢谢

(1)http://developer.kde.org/~wheeler/taglib.html
  (2)http://clucene.sourceforge.net/
  (3)http://developer.kde.org/~wheeler/taglib/api/classTagLib_1_1ID3v2_1_1Frame.html#6aac53ec5893fd15164cd22c6bdb5dfd
  (4)http://ohnopublishing.net/doc/clucene-0.9.21b/html/classlucene_1_1document_1_1Field.html#59b0082e2ade8c78a51a64fe99e684b2

2 个答案:

答案 0 :(得分:1)

在一个简单的情况下,char s不包含任何重音字符或类似内容,您只需将每个字符复制到目的地并使用它:

std::vector<char> frameID;

std::vector<wchar_t> field_name;

std::copy(frameID.begin(), frameID.end(), std::back_inserter(field_name));

lucene_write_field(&field_name[0], field_name.length());

我的猜测是,对于ID3帧ID,你没有重音字符等,所以你可能只需要它。如果你确实有可能使用重音字符等,那么事情会变得更加复杂 - 你需要从ISO 8859-x转换为(可能)UTF-16 Unicode。要做到这一点,你需要一个代码页来告诉你如何解释输入(例如,ISO 8859有几种,例如法语输入的一个与俄语不同)。

答案 1 :(得分:0)

为了防止大字符值变为负wchar_t值,您需要确保转换为无符号。虽然我认为这在技术上是不确定的,但是这有效:

unsigned char* uchar = reinterpret_cast<unsigned char*>(&vect[0]);

std::vector<wchar_t> vwchar(uchar, uchar + vect.size());

如果您的文字在字符集中包含127以上的内容,这一点很重要。

另请注意,这些答案都没有正确处理UTF-any。