2010-09-16 21 views
6

tôi cần phải chuyển đổi một QChar đến một wchar_tQChar để wchar_t

Tôi đã thử những điều sau đây:

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 

    QString mystring = "Hello World\n"; 
    wchar_t myArray[mystring.size()]; 

    for (int x=0; x<mystring.size(); x++) 
    { 
     myArray[x] = mystring.at(x).toLatin1(); 
     cout << mystring.at(x).toLatin1(); // checks the char at index x (fine) 
    } 

    cout << "myArray : " << myArray << "\n"; // doesn't give me correct value 
    return 0; 
} 

Oh và trước khi ai đó gợi ý sử dụng chức năng .toWCharArray (* mảng wchar_t), tôi đã thử điều đó và về cơ bản nó cũng giống như trên và không chuyển các ký tự như nó cần.

Dưới đây là mã cho rằng nếu bạn không tin tôi:

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 
QString mystring = "Hello World\n"; 
cout << mystring.toLatin1().data(); 
wchar_t mywcharArray[mystring.size()]; 
cout << "Mystring size : " << mystring.size() << "\n"; 
int length = -1; 
length = mystring.toWCharArray(mywcharArray); 
cout << "length : " << length;  
cout << mywcharArray; 

return 0; 

} 

Hãy giúp đỡ, tôi đã ở vấn đề đơn giản này trong nhiều ngày. Tôi lý tưởng là không sử dụng wchar_t's ở tất cả, nhưng tiếc là một con trỏ đến loại này là cần thiết trong một chức năng của bên thứ ba để kiểm soát một máy bơm sử dụng lệnh RS232 nối tiếp.

Cảm ơn.

EDIT: Để chạy mã này, bạn sẽ cần các thư viện QT, bạn có thể lấy chúng bằng cách tải xuống trình tạo QT và để có được đầu ra trong bàn điều khiển, bạn sẽ phải thêm lệnh "CONFIG + = console" vào. tập tin chuyên nghiệp (trong tác giả QT) hoặc các định nghĩa tùy chỉnh theo thuộc tính nếu sử dụng dự án netbeans.

EDIT:

Nhờ Vlad dưới đây để trả lời đúng của mình:

Đây là mã cập nhật để làm điều tương tự nhưng sử dụng một char chuyển bằng phương pháp char và ghi nhớ để thêm việc chấm dứt null.

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 


    QString mystring = "Hello World\n"; 
    wchar_t myArray[mystring.size()]; 

    for (int x=0; x<mystring.size(); x++) 
    { 
     myArray[x] = (wchar_t)mystring.at(x).toLatin1(); 
     cout << mystring.at(x).toLatin1(); 
    } 

    myArray[mystring.size()-1] = '\0'; // Add null character to end of wchar array 
    wcout << "myArray : " << myArray << "\n"; // use wcout to output wchar_t's 

    return 0; 
} 
+0

Giống như Vlad chỉ ra dưới đây, mã của bạn về cơ bản là chính xác khác hơn là sử dụng cout cho đầu ra chuỗi wchar_t. Thay đổi cout cuối cùng để wcout sẽ cho bạn kết quả chính xác. –

Trả lời

7

Dưới đây là một ví dụ về chuyển đổi QString vào cả hai std::wstringwchar_t mảng:

#include <iostream> 
#include <QtCore/QString> 

using namespace std; 

int main() 
{ 
    // Create QT string. 
    QString qstr = "Hello World"; 

    // Convert it into standard wstring. 
    std::wstring str = qstr.toStdWString(); 

    // Get the wchar_t pointer to the standard string. 
    const wchar_t *p = str.c_str(); 

    // Output results... 
    wcout << str << endl; 
    wcout << p << endl; 

    // Example of converting to C array of wchar_t. 
    wchar_t array[qstr.size() + 1]; 
    int length = qstr.toWCharArray (array); 
    if (length < 0 || length >= sizeof(array)/sizeof (array[0])) 
    { 
     cerr << "Conversion failed..." << endl; 
     return 1; 
    } 

    array[length] = '\0'; // Manually put terminating character. 
    wcout << array << endl; // Output... 
} 

Xin lưu ý rằng chuyển đổi QString vào mảng nhiều dễ bị lỗi và đó để chuỗi unicode đầu ra, bạn phải sử dụng std::wcout thay vì std::cout, là luồng đầu ra tương tự nhưng cho wchar_t.

+0

Mảng 'wchar_t này [qstr.size() + 1];' không phải là C và nó không phải là C++. –

+0

@BenVoigt: Chắc chắn, đó là VLA. Sắp có mặt trong C++! –

+1

No. C++ sẽ có một tính năng tương tự, nhưng 'sizeof' (mà câu trả lời của bạn sử dụng) không hoạt động trên mảng tự động có kích thước thời gian chạy C++. Tất nhiên, việc bạn sử dụng sizeof là vô nghĩa, như thể tình trạng đó bị vi phạm, bạn đã tràn ngập bộ đệm và không có nhiều việc bạn có thể làm để phục hồi. OTOH [tài liệu 'toWCharArray'] (http://qt-project.org/doc/qt-4.8/qstring.html#toWCharArray) đưa ra lời hứa về độ dài tối đa cần thiết, vì vậy điều kiện có thể đơn giản được loại bỏ. –

Các vấn đề liên quan