gpt4 book ai didi

c++ - 字符串文字如何存储在 C++ 的内存中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:21 24 4
gpt4 key购买 nike

我有一个关于字符串文字在 C++ 中如何存储在内存中的问题。我知道 char 是根据他们的 ascii 代码存储的,但我更喜欢 unicode 字符集。这样做的原因是我尝试处理一些语言环境。让我们假设我正在尝试做的是将小写字符转换为大写字符。这适用于 Xcode 终端,

#include <iostream>
#include <string>
#include <cctype>
#include <clocale>

using namespace std;

int main()
{
wcout.imbue(std::locale("sv_SE.Utf-8"));
const std::ctype<wchar_t>& f = std::use_facet< std::ctype<wchar_t> >(std::locale("sv_SE.Utf-8"));

wstring str {L"åäö"}; // Swedish letters

f.toupper(&str[0], &str[0] + str.size());

std::wcout << str.length() << std::endl;
std::wcout << str << std::endl;
}

Output:
3
ÅÄÖ

但是,当我尝试在 OS X 终端中运行它时,我得到了垃圾,

Output:
3
ÅÄÖ

此外,当我提示用户输入时,

#include <iostream>
#include <string>
#include <cctype>
#include <clocale>

using namespace std;

int main()
{
wcin.imbue(std::locale(""));
wcout.imbue(std::locale("sv_SE.Utf-8"));
const std::ctype<wchar_t>& f = std::use_facet< std::ctype<wchar_t> >(std::locale("sv_SE.Utf-8"));

//wstring str {L"åäö"};
wcout << "Write something>> ";
wstring str;
getline(wcin, str);

f.toupper(&str[0], &str[0] + str.size());

std::wcout << str.length() << std::endl;
std::wcout << str << std::endl;
}

我从 Xcode 终端得到垃圾,

Output:
Write something>> åäö
6
åäö

当我使用这些字母时,OS X 终端实际上​​挂起了。可以修改 wcin 流以采用 C 编码 wcin.imbue(std::locale());,这在 Xcode 中仍然提供相同的输出,但给出以下在 OS X 终端:

Output:
Write something>> åäö
3
ŒŠš

所以问题很明显与编码有关。所以我想知道字符串文字实际上是如何存储在 C++ 的内存中的。这可以分为两种不同的情况。

情况 1:源代码中键入的字符串文字,例如 wstring str {L"åäö"};

情况 2:通过标准输入流(在本例中为 wcin)输入的字符串。

这两种情况下存储字符串的方式不一定相同。我知道 unicode 是一个字符集,而 utf-8 是一种编码,所以我想知道的是,字符串文字在存储在内存中时是否经过编码,在这种情况下如何编码。

此外,如果有人知道如何以自动方式识别当前终端中使用的编码,那就太好了。

BR帕特里克

编辑

我收到一些评论,尽管其中一些评论不错,但与问题并不完全相关。这意味着这个问题可能需要一些澄清。这个问题可以被看作是一个相当糟糕的问题的概括:

“我可以假设字符串文字与它们的 unicode 点代码一起存储在内存中吗?”

至少出于两个原因,这个问题的表述很糟糕。首先,它假设字符串文字是如何存储的(使用它们的 unicode 代码点)。这意味着答案必须与 unicode 相关,即使这种关系可能完全没有意义。此外,这个问题是一个是或否类型的问题,如果答案是否定的,这将没有任何帮助。

我也明白,这可以通过将代码点转换为其等效整数并打印出来进行测试,但这需要我针对整个 unicode 字符集对其进行测试(这似乎是一种不合理的做法)。

最佳答案

首先,文件被解释为字符序列的方式是实现定义的。您必须查阅您的编译器文档来确定这一点。

其次,使用的字符集也是实现定义的。因此,您必须再次为此咨询您的编译器。

当您插入非 ascii 字符时(也可能在使用 ascii 时)可能发生的情况是编译器会对它们进行不同的解释。您必须检查不同的编译器是否实际上可以处理相同的编码,最有可能可移植工作的源编码是 UTF-8。

此外,也许您最好为大部分程序使用 UTF-8 编码的文本(只有靠近需要 wchar_t 的 API 才需要以这种方式处理字符串)。

底线。确保您的编译器逐字存储字符串文字并使用普通(窄)字符串,并使用以 UTF-8 编码保存的编辑器。

关于c++ - 字符串文字如何存储在 C++ 的内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com