gpt4 book ai didi

c++ - 来自 Unicode 字符的代码点?

转载 作者:行者123 更新时间:2023-11-28 00:11:22 25 4
gpt4 key购买 nike

以前有人问过这个问题,但它的解决方案依赖于我不想依赖的 Microsoft 基础类。基本上我想做的是将 Unicode 字符转换成它的等效代码点。

下面是使用 MFC 的解决方案。有没有办法在不使用 afxwin.h 的情况下执行此操作?

#include <afxwin.h>

#include <iostream>

int main() {
using namespace std;

TCHAR myString[50] = _T("عربى");
int stringLength = _tcslen(myString); // <----- edit here

for(int i=0;i<stringLength;i++)
{
unsigned int number =myString[i];
cout<<number<<endl;
}
}
Output:

1593
1585
1576
1609

最佳答案

更新

如果您的编译器支持,最简单的方法可能是将常量字符串写为 U"عربى" .这给你一个 char32_t 的数组代码点只是用 static_cast<uint32_t>() 转换的值的字符.要以标准格式打印它们,只需在前面加上 U+并打印十六进制值。

在 C++14 编译器上试试这个(我建议将源文件保存为 utf-8)。

#include <cstdlib>
#include <iomanip>
#include <iostream>

using std::cout;

int main()
{
constexpr char32_t codepoints[] = U"عربى";
constexpr size_t n = sizeof(codepoints)/sizeof(char32_t);

cout.setf( cout.hex, cout.basefield ); // Output in hex
cout.setf( cout.right, cout.adjustfield ); // Prepending
cout.fill('0'); // leading zeroes
// Fixed: Don’t print the terminating U'\0'.
for ( size_t i = 0; i < n && codepoints[i]; ++i )
cout << "U+" << std::setw(4) << (unsigned long)codepoints[i] << std::endl;

return EXIT_SUCCESS;
}

转化

C++ STL 有 <codecvt>现在,它可以从 utf-8 或 utf-16 转换为 ucs-32。示例代码(来自 http://en.cppreference.com/w/cpp/locale/codecvt_utf16 ):

#include <fstream>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>

void prepare_file()
{
// UTF-16le data (if host system is little-endian)
char16_t utf16le[4] ={0x007a, // latin small letter 'z' U+007a
0x6c34, // CJK ideograph "water" U+6c34
0xd834, 0xdd0b}; // musical sign segno U+1d10b
// store in a file
std::ofstream fout("text.txt");
fout.write( reinterpret_cast<char*>(utf16le), sizeof utf16le);
}

int main()
{
prepare_file(); // open as a byte stream
std::wifstream fin("text.txt", std::ios::binary);
// apply facet
fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));

for (wchar_t c; fin.get(c); )
std::cout << std::showbase << std::hex << c << '\n';
}

C11 和 C++11 还具有在多字节 utf-8 和 utf-16 与宽字符串之间进行转换的函数(来自此处:http://en.cppreference.com/w/c/string/multibyte/mbrtoc32)。 mbstowcs()函数也可能相关。

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <uchar.h>
#include <assert.h>

mbstate_t state;

int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
char *str = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
printf("Processing %zu bytes: [ ", strlen(str));
for(char* p = str; *p; ++p)
printf("%#x ", (unsigned char)*p); puts("]");

char32_t c32;
char *ptr = str, *end = str + strlen(str);
int rc;

while(rc = mbrtoc32(&c32, ptr, end - ptr, &state)) {
printf("Next UTF-32 char: %#x obtained from ", c32);
assert(rc != -3); // no surrogate pairs in UTF-32
if(rc > 0) {
printf("%d bytes [ ", rc);
for(int n = 0; n < rc; ++n)
printf("%#x ", (unsigned char)ptr[n]); puts("]");
ptr += rc;
}
}
}

虽然这些示例使用十六进制代码,但 C11 和 C++11 支持 Unicode 字符串 ( http://en.cppreference.com/w/cpp/language/string_literal )。由于上面示例中的 Unicode 是 utf-16le,因此将其写为常量的标准方法是 u"عربى" .您也可以使用 U"عربى" 将其编码为 ucs-32并且不必进行任何代理对转换。

关于c++ - 来自 Unicode 字符的代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940349/

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