- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何在控制台/屏幕上打印这样的字符串:€áa¢cée£
?我试过这个:
#include <iostream>
#include <string>
using namespace std;
wstring wStr = L"€áa¢cée£";
int main (void)
{
wcout << wStr << " : " << wStr.length() << endl;
return 0;
}
这是行不通的。甚至令人困惑,如果我从字符串中删除 €
,打印出来的结果是这样的:?a?c?e? : 7
但字符串中有 €
时,€
字符后不会打印任何内容。
如果我用 python 编写相同的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
wStr = u"€áa¢cée£"
print u"%s" % wStr
它在同一个控制台上正确打印出字符串。我在 C++ 中缺少什么(好吧,我只是一个菜鸟)?干杯!!
#include <iostream>
#include <string>
using namespace std;
string wStr = "€áa¢cée£";
char *pStr = 0;
int main (void)
{
cout << wStr << " : " << wStr.length() << endl;
pStr = &wStr[0];
for (unsigned int i = 0; i < wStr.length(); i++) {
cout << "char "<< i+1 << " # " << *pStr << " => " << pStr << endl;
pStr++;
}
return 0;
}
首先,它报告 14
作为字符串的长度:€áa¢cée£ : 14
是因为它计算每个字符 2 个字节吗?
我得到的是:
char 1 # ? => €áa¢cée£
char 2 # ? => ??áa¢cée£
char 3 # ? => ?áa¢cée£
char 4 # ? => áa¢cée£
char 5 # ? => ?a¢cée£
char 6 # a => a¢cée£
char 7 # ? => ¢cée£
char 8 # ? => ?cée£
char 9 # c => cée£
char 10 # ? => ée£
char 11 # ? => ?e£
char 12 # e => e£
char 13 # ? => £
char 14 # ? => ?
作为最后一个 cout 输出。所以,我相信实际问题仍然存在。干杯!
更新 2:基于 n.m. 的第二个建议
#include <iostream>
#include <string>
using namespace std;
wchar_t wStr[] = L"€áa¢cée£";
int iStr = sizeof(wStr) / sizeof(wStr[0]); // length of the string
wchar_t *pStr = 0;
int main (void)
{
setlocale (LC_ALL,"");
wcout << wStr << " : " << iStr << endl;
pStr = &wStr[0];
for (int i = 0; i < iStr; i++) {
wcout << *pStr << " => " << static_cast<void*>(pStr) << " => " << pStr << endl;
pStr++;
}
return 0;
}
这就是我得到的结果:
€áa¢cée£ : 9
€ => 0x1000010e8 => €áa¢cée£
á => 0x1000010ec => áa¢cée£
a => 0x1000010f0 => a¢cée£
¢ => 0x1000010f4 => ¢cée£
c => 0x1000010f8 => cée£
é => 0x1000010fc => ée£
e => 0x100001100 => e£
£ => 0x100001104 => £
=> 0x100001108 =>
为什么报告为 9
而不是 8
?或者这是我应该期待的?干杯!!
最佳答案
在字符串文字前删除 L
。使用 std::string
,而不是 std::wstring
。
UPD:有更好(正确)的解决方案。保留 wchar_t、wstring 和 L,并在程序开头调用 setlocale(LC_ALL,"")
。
无论如何,您应该在程序的开头调用 setlocale(LC_ALL,"")
。这会指示您的程序使用您环境的语言环境,而不是默认的“C”语言环境。你的环境有一个 UTF-8,所以一切都应该工作。
在不调用 setlocale(LC_ALL,"")
的情况下,该程序使用 UTF-8 序列而不会“意识到”它们是 UTF-8。如果在终端上打印出正确的 UTF-8 序列,它将被解释为 UTF-8,一切看起来都很好。如果您使用 string
和 char
就会发生这种情况:gcc 使用 UTF-8 作为字符串的默认编码,并且 ostream 会在不应用任何转换的情况下愉快地打印它们。它认为它有一个 ASCII 字符序列。
但是当你使用 wchar_t
时,一切都崩溃了:gcc 使用 UTF-32,没有应用正确的重新编码(因为语言环境是“C”)并且输出是垃圾。
当您调用 setlocale(LC_ALL,"")
时,程序知道它应该将 UTF-32 重新编码为 UTF-8,然后一切都恢复正常。
这一切都假设我们只想使用 UTF-8。使用任意语言环境和编码超出了本答案的范围。
关于c++ - 如何在 Linux/OS X 上打印 wstring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799762/
我想像下面的 c++ 代码一样使用 std::wstring 类型编写 ChaiScript 代码。 #include int testfunc(std::wstring s, std::wstri
以下是我尝试过的,但没有成功。 std::wstring = L"Text"; USES_CONVERSION; LPOLESTR lpDesc = W2OLE((LPWSTR)wsDescr.c_s
我有一个 map . 我插入了这样的对: m_Translations.Content().insert(pair(L"rome",L"roma")); m_Translations.Content(
我正在使用 std::string 作为文本缓冲区。然后,我确定该缓冲区中包含的数据是 UTF-16(即它实际上是一个 std::wstring)。 如何将 std::string 强制转换为 std
摘录如下: ... std::vector vecWstr; vecWstr.emplace_back(L"1"); wchar_t* data1 = vecWstr[0].data(); //在一个
我知道这应该很容易,但我就是没能消除编译错误。这是我的代码: template struct basic_field_type_map : public hash_map, basic_string>
我在 C++ 中有一个 wstring 变量和一个字符串变量。我想将它们连接起来,但简单地将它们相加会产生构建错误。我怎样才能将它们结合起来?如果我需要将 wstring 变量转换为字符串,我该如何完
我有一个简单的记录器类,我试图将其变成接受和输出 wstrings 而不是字符串。 标题: #include using namespace std; class CLog { public:
我的问题是,以前用于字符串的方法都不能用于 wstring。所以我问我如何才能轻松清除 wstring 以达到美学目的。 我现在的代码: while (!foundRightOne)
我已经尝试使用 wchar_t 和一个 for 循环来通过 wchar 读取内存 wchar 并且它有效。工作代码: int cl = 20; std::wstring wstr; wchar_t L
我正在尝试将一个整数附加到 wstring: TCHAR buffer[MAX_PATH]={0}; GetModuleFileName(NULL, buffer, sizeof(buffer)/si
我定义了这样一个枚举: enum eFeature { eF_NONE=0, eF_PORT_A=1, eF_PORT_B=2, eF_PORT_C=3, }; 我现在
我想简化代码以对 ANSI 和 UNICODE 字符串版本使用相同的函数 tstring formatW(const std::string format, ...); tstring formatA
如果我想要像下面这样的函数在 basic_string 上工作和 basic_string我应该怎么办?请注意,它必须更改 wchar_t在无序映射中。 函数还需要接受wchar_t数组以支持将参数作
我有一个 wstring 变量,我想按空格字符拆分它并放入一个 vector wstring wStr = L"Hello World !"; vector vw; wstring st = L"";
我想定义一个 union 体,用于读取特殊类型的二进制文件。 union 应该有两个成员,一个是 int,另一个是一种字符串,或者任何其他的问题;执行此操作的最佳方法是什么? union uu {
目前,我正在为一位中国客户开发一款应用。中国客户大多在其操作系统编码中切换到 GB2312 语言。我需要编写一个文本文件,它将使用 GB2312 进行编码。 我使用std::ofstream 文件 我
在我的程序中,我使用 wstring 打印出我需要的文本,但它给了我随 secret 码(由于不同的编码方案)。例如,我有这段代码。 wstring text; text.append(L"Some
我是 C++ 新手,遇到了这个问题。我有一个名为 DATA_DIR 的字符串,我需要将其格式化为 wstring。 string str = DATA_DIR; std::wstring temp(L
我有一个包含文本的 std::wstring 变量,我需要用分隔符将它拆分。我怎么能这样做?我不会使用会产生一些警告的 boost。谢谢 编辑 1这是一个示例文本: hi how are you? 这
我是一名优秀的程序员,十分优秀!