首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串文本如何存储在c++的内存中?

字符串文本如何存储在c++的内存中?
EN

Stack Overflow用户
提问于 2015-10-16 06:15:14
回答 2查看 970关注 0票数 3

关于字符串文本如何存储在c++的内存中,我有一个问题。我知道char是根据他们的ascii代码存储的,但是我比较喜欢unicode字符集。这样做的原因是我试图处理一些地区。让我们假设我要做的是将小写字符转换为大写字符。它在Xcode终端中工作,

代码语言:javascript
复制
#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终端上运行它时,我会收到垃圾,

代码语言:javascript
复制
Output:
3
ÅÄÖ

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

代码语言:javascript
复制
#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终端收到垃圾,

代码语言:javascript
复制
Output:
Write something>> åäö
6
åäö

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

代码语言:javascript
复制
Output:
Write something>> åäö
3
ŒŠš

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

案例1:在源代码中输入的字符串文字(如wstring str {L"åäö"}; )。

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

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

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

布尔帕特里克

编辑

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

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

这个问题提出得很糟糕,至少有两个原因。首先,它假设字符串文本是如何存储的(以及它们的unicode代码点)。这意味着答案必须与unicode相关,尽管这种关系可能完全没有意义。此外,这个问题是“是”或“否”的问题,如果答案是“否”的话,这是没有帮助的。

我还了解到,可以测试将代码点转换为其整数等效值并打印它,但这将要求我对整个unicode字符集进行测试(这似乎是一种不合理的方法)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 06:14:23

首先,定义了将文件解释为字符序列的方式。要确定这一点,您必须查阅编译器文档。

其次,还定义了所使用的字符集。因此,同样地,您必须咨询编译器。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2020-11-13 19:50:18

在这里看到的关于这个主题的string_literal页面有很好的背景

literal

我讨论这个问题并不是为了字节和编码存储,而是为了了解它们在内存中的位置,它位于应用程序的静态内存中:

字符串文本具有静态存储时间,因此在程序的生命周期中存在于内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33163677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档