【问题标题】:Spanish letters with accents [í é] appear as strange symbols带有重音符号 [í é] 的西班牙字母显示为奇怪的符号
【发布时间】:2014-11-14 22:15:34
【问题描述】:

我编写了一个显示提醒的程序,其中一些是西班牙语,一些是英语。英文的显示没有任何问题,但在西班牙的中,带有重音符号 [í é] 的字母显示为奇怪的符号。这是否意味着 Windows7 无法处理此字形并因此需要升级,或者 ASCII 表有误?我可以做些什么来解决这个问题?

#include <windows.h>
#include <string>

using STR_VECTOR = std::vector<std::wstring>;
...
class MyClass{
...
private: std::shared_ptr<STR_VECTOR> quote;
private: std::wstring wstr;
..  
public: MyClass();
};
CPP file
~~~~~~
MyClass::MyClass(){
   quote.reset(new VECTORSTR);
    //... bla bla bla
quote->push_back(L"Yes, Thus is the wolf");
quote->push_back(L"Sí, así es el lobo");
    //... bla bla bla
uint64_t vec_size = quote->size();
    std::srand ((uint64_t)std::time(0));
   quote_num = rand( ) % ( vec_size );
   wstr = quote->at( quote_num );
   MessageBoxEX( NULL, wstr.c_str( ), TEXT("SomeText"), MB_OK | MB_ICONINFORMATION,0 );
    app.Write( );
}

【问题讨论】:

  • 我已经重新打开了这个问题,因为您现在已经删除了原来的副本,但请注意,您确实应该编辑过原件,因为现在对原件有帮助的 cmets已经丢失。将来请始终更新您的原始问题,不要发布重复的问题。此外,与网站运作有关的任何问题都属于元数据,而不是您的问题。
  • 将 MessageBoxEx 替换为 MessageBoxW 并重试。
  • 您在同一个程序中使用TEXT 宏和L"" 字符串,这是不一致的。我建议对宽字符进行标准化并避免使用 TCHAR 宏。
  • wstr = quote->at(quote_num); MessageBoxW(NULL, wstr.c_str(), std::wstring("Un buen día").c_str(), MB_OK | MB_ICONINFORMATION);
  • 字母í在MessageBoxW的文本区显示为Ã,但后面的'title'中却正确显示。

标签: c++ windows visual-c++ c++11 localization


【解决方案1】:

字母í在MessageBoxW的文本区显示为Ã

当您要求 MessageBoxW 显示 utf-8 编码文本时,该字母会出现。问题在于您的源代码文件。它以 utf-8 编码保存,但编译器不知道这一点。它假定您使用机器的默认代码页保存它。当您说西班牙语时,通常为 1252。

再次打开文件,进行任意更改,然后单击“文件”+“另存为”。单击“保存”按钮上的箭头,然后选择“使用编码保存”。选择“Unicode(带签名的UTF8)-代码页65001”。该文件现在将有一个 BOM,因此编译器确实知道它包含 utf-8 编码的文本。

这是默认设置,在没有 BOM 的情况下这个文件是如何结束的还不清楚。请注意,如果您使用其他文本编辑器,您会想要重新配置或停用它。

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2020-11-01
    • 2012-09-28
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多