2010-06-29 8 views
1

ID3 프레임과 그 값을 TagLib (1)로 읽고 CLucene (2)로 색인하려고합니다. 전자는 std::vector<char> (3)으로 프레임 ID를 반환하고 후자는 필드 이름을 리눅스에서 tchar* [wchar_t*] (4)로 씁니다. 두 사람 사이에 링크를 만들어야합니다. 어떻게 std::vector<char>에서 wchar_t*으로 STL로 변환 할 수 있습니까? 당신의 char의이 같은 강조 문자 또는 아무것도를 포함하지 않는 단순한 경우에는 당신에게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

답변

1

감사합니다 각 하나를 대상에 복사하고 사용하면됩니다.

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 유니 코드로 변환해야합니다. 그렇게하려면 입력을 해석하는 방법을 알려주는 코드 페이지가 필요합니다 (예 : ISO 8859의 여러 가지 종류가 있으며 프랑스어 입력의 경우 러시아어 입력과 다를 수 있음).

+3

'std :: vector'의 생성자를 사용하여'std :: copy'를 피할 수 있습니다 :'std :: vector field_name (frameID.begin(), frameID.end()); 조금 더 간결합니다. – GManNickG

+0

이로 인해 서명 된 char이있는 시스템에서 바람직하지 않은 동작이 발생할 수 있습니다. 문제는 복사 작업 중에 적용될 정적 형변환이 부정적인 wchar_t 값으로 음수가되기 전에 char 값> max를 돌려 주지만 아마도 원하는대로 비트 형 복사본이 아닙니다. –

+0

> "귀하의 문자에는 악센트 부호가있는 문자가 없거나 그런 문자가 없습니다."실제로는 입니다. 나는 러시아 출신이다. 그래서 러시아 노래를 가지고있다 .-) – theorist

0

큰 char 값이 음수 wchar_t 값이되지 않게하려면 부호없는 값으로 변환해야합니다. 이것은 기술적으로 정의되지 않았다고 생각하지만 작동합니다 :

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

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

텍스트에 127보다 큰 문자가 포함되어있는 경우 중요합니다.

또한 이러한 답변 중 어느 것도 UTF와는 아무런 관련이 없음을 유의하십시오.

+0

이 경우 비 ASCII 문자를 다룰 필요가 없습니다. 프레임 ID는 문자 "A-Z"와 "0-9"만을 포함합니다. –

관련 문제