相关疑难解决方法(0)

C++ wchar_t和wstrings有什么"错误"?宽角色有哪些替代方案?

我见过C++社区中的很多人(特别是freenode上的## c ++)对windows api 的使用wstrings和使用感到不满wchar_t.究竟是什么"错误"有wchar_twstring,如果我要支持国际化,有一些什么替代宽字符?

c++ unicode winapi internationalization wstring

81
推荐指数
2
解决办法
3万
查看次数

C++ 11中字符串文字的Unicode编码

在一个相关的问题之后,我想问一下C++ 11中的新字符和字符串文字类型.看来我们现在有四种字符和五种字符串文字.角色类型:

char     a =  '\x30';         // character, no semantics
wchar_t  b = L'\xFFEF';       // wide character, no semantics
char16_t c = u'\u00F6';       // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF';   // 32-bit, assumed UCS-4
Run Code Online (Sandbox Code Playgroud)

和字符串文字:

char     A[] =  "Hello\x0A";         // byte string, "narrow encoding"
wchar_t  B[] = L"Hell\xF6\x0A";      // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6";        // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto     E[] = u8"\u00F6\U0010FFFF"; // (3)
Run Code Online (Sandbox Code Playgroud)

问题是:\x/ \u/ \U …

c++ unicode utf string-literals c++11

76
推荐指数
1
解决办法
5万
查看次数

WChars,编码,标准和可移植性

以下可能不符合SO问题; 如果它超出范围,请随时告诉我离开.这里的问题基本上是,"我是否正确理解C标准,这是正确的方法吗?"

我想请求澄清,确认和更正我对C中字符处理的理解(以及C++和C++ 0x).首先,一个重要的观察:

可移植性和序列化是正交概念.

便携式东西就像C unsigned int, wchar_t. 可序列化的东西就像uint32_t或UTF-8."Portable"意味着您可以重新编译相同的源并在每个支持的平台上获得工作结果,但二进制表示可能完全不同(或者甚至不存在,例如TCP-over-carrier pigeon).另一方面,可序列化的东西总是具有相同的表示,例如我可以在Windows桌面,手机或牙刷上读取的PNG文件.便携式东西是内部的,可序列化的东西处理I/O. 便携式东西是类型安全的,可序列化的东西需要打字.</前导>

当谈到C中的字符处理时,有两组分别与可移植性和序列化相关:

  • wchar_t,setlocale(),mbsrtowcs()/ wcsrtombs():C标准只字未提"编码" ; 事实上,它与任何文本或编码属性完全无关.它只说"你的入口点是main(int, char**);你得到的类型wchar_t可以容纳你所有系统的字符;你得到的函数来读取输入字符序列并使它们成为可行的字符串,反之亦然.

  • iconv()和UTF-8,16,32:在定义明确的固定编码之间进行转码的函数/库.由iconv处理的所有编码都得到普遍理解和同意,但有一个例外.

C的便携式,编码不可知世界与其wchar_t可移植的字符类型和确定性外部世界之间的桥梁是WCHAR-T和UTF之间的iconv转换.

那么,我是否应该始终将我的字符串内部存储在与编码无关的wstring,与CRT via的接口中wcsrtombs(),并iconv()用于序列化?概念:

                        my program
    <-- wcstombs ---  /==============\   --- iconv(UTF8, WCHAR_T) -->
CRT                   |   wchar_t[]  |                                <Disk>
    --- mbstowcs -->  \==============/   <-- iconv(WCHAR_T, UTF8) ---
                            |
                            +-- iconv(WCHAR_T, UCS-4) --+
                                                        |
       ... <--- (adv. …
Run Code Online (Sandbox Code Playgroud)

c++ unicode wchar-t

60
推荐指数
4
解决办法
1万
查看次数

`<cuchar>`提供什么,它在哪里记录?

新的C++ 11标准提到了一个标题<cuchar>,可能与C99类似<uchar.h>.

现在,我们知道C++ 11带来了专门为UTF16和UTF32设计的新字符类型和文字,但我不认为该语言实际上会包含将(系统相关的)窄多字节编码转换为其中一个的函数. Unicode编码.但是,我刚刚遇到了<cuchar>提及函数mbrtoc16/ c16rtombrmbrtoc32/ 的头文件概要c32rtombr.

不幸的是,标准没有提到标题概要之外的那些功能.这些功能在哪里定义,他们真正做了什么,在哪里可以阅读更多关于它们的内容?这是否意味着现在可以使用标准C++完全使用适当的Unicode,而无需任何额外的库?

c++ unicode c++11

16
推荐指数
1
解决办法
1571
查看次数

字符*编码

如果我在Visual Studio下用C++编写下面的语句,那么这里将编码什么?

const char *c = "£";
Run Code Online (Sandbox Code Playgroud)

在Visual Studio项目设置下,我将"Charset"设置为"Not set".

c++ encoding visual-c++

13
推荐指数
1
解决办法
9136
查看次数

std :: u8string与std :: string有何不同?

如果我有一个字符串:

std::string s = u8"??";
Run Code Online (Sandbox Code Playgroud)

在C ++ 20中

std::u8string s = u8"??";
Run Code Online (Sandbox Code Playgroud)

有何std::u8string不同std::string

c++ string unicode c++20

8
推荐指数
1
解决办法
380
查看次数

C++ 中无前缀字符串的编码是什么?

C++ 中无前缀字符串的编码是什么?例如,所有字符串文字在 Java 中都被解析并存储为 UTF-16,在 Python3 中则被解析为 UTF-8。我猜想 C++ 文字就是这种情况u8""。但我不清楚像 之类的普通文字""

以下代码的输出应该是什么?

#include <iostream>
#include <iomanip>

int main() {
    auto c = "Hello, World!";
    while(*c) {
        std::cout << std::hex << (unsigned int){*c++} << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在我的机器上运行它时,它会给出以下输出:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 
Run Code Online (Sandbox Code Playgroud)

但这有保证吗?字符串文字的 Cppreference 页面表示普通字符串文字中的字符来自翻译字符集,翻译字符集指出:

翻译字符集由以下元素组成:

  • 由 ISO/IEC 10646 命名的每个字符,由其唯一的 UCS 标量值标识,以及
  • 每个 UCS 标量值的不同字符,其中未分配命名字符。

从这个定义来看,翻译字符集似乎是指 Unicode(或其超集)。那么除了显性之外,""和之间没有区别吗?u8""

假设如果我希望我的字符串采用 EBCDIC 编码(只是作为练习),那么在 …

c++ string character-encoding string-literals

5
推荐指数
1
解决办法
310
查看次数

cpp文件没有在clang ++和g ++中编译

我已经在C++上工作了几年,已经编写了几次东西,但是下面这个问题对我来说是全新的,它只是没有意义.

以下是我遵循的步骤:

  • 使用cygwin设置与g ++版本:6.4.0和clang ++版本:4.0.1
  • 创建了一个新的cpp fie,使用sublime文本添加简单的cout并
    使用以下命令编译:clang ++ -g -Wall -std = c ++ 14 thread1.cpp -o thread,工作正常.
  • 添加新的内容可能是另一个cout,这次编译时我得到了大量的错误,说明它不是utf-8文件.
  • 在sublime文本中使用utf-8编码保存文件,并尝试使用utf-8 BOM编码,仍然获得相同而不是utf-8文件错误.
  • 在cygwin中运行file命令检查文件编码,文件-i thread1.cpp,输出为thread1.cpp:text/xc; 字符集= UTF-8.

这里有什么可能出错的指针?

以下是编译的代码:

#include "iostream"
#include "thread"
#include "mutex"
using namespace std;

class threadFunctor{
        public:

};
int main(int argc , char** argv){
   cout << "Hello";
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下代码给出错误:

#include "iostream"
#include "thread"
#include "mutex"
using namespace std;

class threadFunctor{
        public:
};
int main(int argc , char** argv){
   cout << "Hello World";
   return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ encoding utf-8 clang c++11

0
推荐指数
1
解决办法
334
查看次数