2013-03-08 1 views
1

Я пытаюсь выполнить задачу, но мой код не разделяется. Вот основные функции:C++ разделение строки unicode с использованием wstring

#define SQL_TEXT Latin_Text 
#include <iostream> 
#define SQL_TEXT Latin_Text 
#include <sqltypes_td.h> 
#include "Split.h" 
#include <string> 
#include <stdio.h> 
#include <vector> 
#include <cstring> 

using namespace std; 
int main() 
{ 
    VARCHAR_LATIN *result = new VARCHAR_LATIN[512]; 
    wchar_t *s1 = (wchar_t *)"Myýnameýisýzeeshan"; 
    **splitstringwc s(s1); 
vector<wstring> flds = s.splitwc((wchar_t)'ý');** 
    wstring rs = flds[1]; 
    wcout<<rs<<endl; 
for (int k = 0; k < flds.size(); k++) 
     cout << k << " => " << flds[k].data() << endl; 

    cout<<result; 
    return 0; 
} 

код для splitstringwc класса выглядит следующим образом:

public: 
splitstringwc(wchar_t *s) : wstring(s) { }; 
vector<wstring>& splitwc(wchar_t delim, int rep=0); 
}; 


vector<wstring>& splitstringwc::splitwc(wchar_t delim, int rep) { 
if (!flds1.empty()) flds1.clear(); // empty vector if necessary 
wstring ws = data(); 
wcout<<ws<<endl; 
//wcout<<delim<<endl; 

//wstring ws; 
//int j = StringToWString(ws, work); 
wstring buf = (wchar_t *)""; 
int i = 0; 
while (i < ws.size()) { 
    if (ws.at(i) != delim) 
     buf += ws.at(i); 
    else if (rep == 1) { 
     flds1.push_back(buf); 
     buf = (wchar_t *)""; 
    } else if (buf.size() > 0) { 
     flds1.push_back(buf); 
     buf = (wchar_t *)""; 
    } 
    i++; 
} 
if (!buf.empty()) 
    flds1.push_back(buf); 
return flds1; 

}

код оленья кожа разделить строку ввода, когда я пытаюсь отладки, я получаю ошибка сегментации: wstring ws = data();

пожалуйста, помогите ...............

+0

Связанные: http://www.utf8everywhere.org/, http://www.joelonsoftware.com/articles/Unicode.html, –

ответ

0

Вы не можете использовать обычные строковые и символьные литералы при работе со строками широких символов. Они тоже должны быть широкими символами, как

const wchar_t *s1 = L"Myýnameýisýzeeshan"; 

Обратите внимание на L перед буквальным, это делает строку строки широких символов.

То же используется для символьных литералов:

s.splitwc(L'ý') 
+0

нормально, но я заливка обычной строки в wstring как это: wchar_t * s1 = (wchar_t *) «Myýnameýisýzeesheshan»; это не будет работать? –

+0

@MuhammadZeeshanArif Нет, он не будет работать только с кастингом. Широкий характер, ну, широкий и занимает более одного байта, который используется обычным узкосимвольным символом. Если вы передаете обычную строку в строку с широким символом, функция будет вести себя, поскольку два или более символа этой строки являются одним широким символом. –

+0

в любом случае, я попробовал s.splitwc (L'ý '), но он говорит об ошибке: преобразование в исполняемый набор символов: недопустимый аргумент –

1

Использование strtok вместо моей собственной функции разделенного, раскалывается строку на основе Юникода разделителем.

код выглядит следующим образом:

str = "Myýnameýisýzeeshan"; 
char *pch; 
pch = strtok(str, "ý"); 
while (pch != NULL) 
{ 
    printf("%s\n", pch); 
    pch = strtok(NULL, "ý"); 
} 

Пожалуйста, обратите внимание, что ули состоит из ANSI строк, разделенных на UNICODE разделитель.