2015-05-12 13 views
5

Vấn đề là tôi đang cố gắng in một số ký tự bên ngoài ASCII như các ký tự âm sắc tiếng Đức, 'ß' và tương tự. Những ký tự này không phù hợp với biến char thông thường, vì vậy rõ ràng là tôi đã cố gắng đặt chúng trong một wchar_t và khởi tạo chuỗi bằng chữ L ".....". Nhưng mỗi khi chuỗi ký tự này chứa một ký tự ở trên, tôi nhận được lỗi được đề cập, nhưng nó là tốt với tất cả các ký tự khác của ASCII. Điều này cũng xảy ra với u "....", U "......" và nếu tôi sử dụng u8 ".....", nó không tạo ra lỗi nhưng in ra rác.Lỗi C++: Chuyển đổi thành Execution Character set

Vì vậy, để những câu hỏi:

  1. Làm thế nào tôi có thể in ký tự này và các nhân vật khác từ bên ngoài bộ ASCII?
  2. Lỗi này là gì, điều đó có nghĩa là gì? Cách duy nhất tôi có thể in các ký tự bằng cách gọi hàm setlocale() để đặt ngôn ngữ thành mặc định môi trường (tiếng Đức) và sau đó bằng cách tạo một mảng bình thường với các ký tự trong nó sẽ không tạo ra lỗi và in chính xác, vấn đề ở đây là TẠI SAO !!? Tôi hoàn toàn không hiểu tại sao nó hoạt động ngay bây giờ, vì kích thước của kiểu char không bị thay đổi nên tôi không giả định lệnh gọi setlocale() thay đổi ánh xạ ký tự trong bộ ký tự mặc định (ASCII bình thường) .
  3. Nếu có ai có thể giải thích thêm về bộ ký tự chủ đề và cách xử lý chúng trong C++ và C, thì tôi sẽ đánh giá cao nó đặc biệt với UTF-8, 16, 32 (bạn không phải viết nó cho mình ngay cả một số khác cũng được tổ chức và tương đối dễ hiểu các trang web mà giải quyết chủ đề kỹ lưỡng hơn là rất hoan nghênh).

Ví dụ như yêu cầu:

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    wstring x = L"öäüß" ; 

    wcout << x ; 

    return 0 ; 
} 

này in lỗi.

#include <iostream> 
#include <string> 
#include <locale> 

using namespace std; 

int main(void) 
{ 

    setlocale(LC_ALL,""); // sets locale to german on my computer 
    string x = "äöüß" ; 

    cout << x ; 

    return 0 ; 
} 

Điều này hoạt động bình thường. Nhưng ngay cả sau khi thay đổi ngôn ngữ nếu tôi tạo mã đầu tiên thì lỗi được tạo.

Lưu ý: Tôi nhận thấy trong C++ (không phải C) mà thậm chí không bao gồm bất kỳ tệp nào khác ngoài iostream rằng tất cả nội dung của các tệp khác như chuỗi hoặc ngôn ngữ hoặc bất kỳ thứ gì khác từ thư viện chuẩn được khai báo và trong không gian tên std. Tôi bỏ qua điều này trong một thời gian và vẫn bao gồm các tập tin cho tài liệu nhưng tại sao điều này xảy ra. (Tôi đang sử dụng tdm-gcc 64bit)

+2

Bạn có thể muốn tạo [Ví dụ tối thiểu, hoàn chỉnh và có thể xác minh] (http://stackoverflow.com/help/mcve) để minh họa sự cố của bạn và bao gồm lỗi xây dựng hoặc đầu ra thực tế và dự kiến. –

+0

ok, tôi sẽ làm điều này. – Lockon2000

+0

Tôi đã bao gồm các ví dụ. – Lockon2000

Trả lời

2

Tôi cũng đã gặp sự cố này khi biên dịch các dự án đa nền tảng được chỉnh sửa ban đầu trong Visual Studio. VS sử dụng một bộ ký tự khác (CP1252, ít nhất là trong trường hợp của tôi), trong khi GCC mong đợi UTF-8. Bạn có thể sử dụng cờ -finput-charset g ++ để cho biết mã hóa mã nguồn của bạn.

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