C++ C++;:字符串问题

C++ C++;:字符串问题,c++,string,encoding,C++,String,Encoding,我有一个简单的代码: #include <iostream> #include <fstream> using namespace std; int main(void) { ifstream in("file.txt"); string line; while (getline(in, line)) { cout << line << " starts with char: " <&

我有一个简单的代码:

#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
    ifstream in("file.txt");
    string line;
    while (getline(in, line))
    {
        cout << line << "    starts with char: " << line.at(0) << " " << (int) line.at(0) << endl;
    }
    in.close();
    return 0;
}
#包括
#包括
使用名称空间std;
内部主(空)
{
ifstream in(“file.txt”);
弦线;
while(getline(in,line))
{

CUT

我认为最后的字符属于扩展ASCII表,C++不支持


> Ed1:从快速的外观看,底部的字符也不在扩展的ASCII中。也许检查Martin York所说的。< /P> < P>我认为最后的字符属于扩展ASCII表,C++不支持

的字符。


Edit1:不,快速查看底部的字符似乎也不是扩展ASCII。请检查Martin York所说的。

您得到的是字符串中的第一个字符

但是看起来这个字符串是UTF-8字符串(或者其他一些多字节字符格式)

这意味着os打印的每个符号(字形)由1个(或多个)字符组成。
如果是UTF-8,则ASCII(0-127)范围之外的任何字符实际上由2个(或更多个字符)组成,字符串打印代码可以正确地解释这一点。但是,字符打印代码不可能正确地对大于127的单个字符进行反编码

我个人认为动态宽度字符格式不适合在程序内部使用(它们适合于传输和存储),因为它们使字符串操作更加复杂。我建议您将字符串转换为固定宽度格式进行内部处理,然后将其转换回UTF-8进行存储


就我个人而言,我会在内部使用UTF-16(或UTF-32,取决于wchar_t是什么)(是的,我从技术上知道UTF-16不是固定宽度,但在所有合理的教学环境中,它是固定宽度(当我们包括沙文脚本时,我们可能需要使用UTF-32))。您只需在输入/输出流中插入适当的codecvt方面即可进行自动翻译。在内部,可以将代码作为单个字符使用wchar\u t type进行操作。

您将获得字符串中的第一个字符

但是看起来这个字符串是UTF-8字符串(或者其他一些多字节字符格式)

这意味着os打印的每个符号(字形)由1个(或多个)字符组成。
如果是UTF-8,则ASCII(0-127)范围之外的任何字符实际上由2个(或更多个字符)组成,字符串打印代码可以正确地解释这一点。但是,字符打印代码不可能正确地对大于127的单个字符进行反编码

我个人认为动态宽度字符格式不适合在程序内部使用(它们适合于传输和存储),因为它们使字符串操作更加复杂。我建议您将字符串转换为固定宽度格式进行内部处理,然后将其转换回UTF-8进行存储


就我个人而言,我会在内部使用UTF-16(或UTF-32,取决于wchar_t是什么)(是的,我从技术上知道UTF-16不是固定宽度,但在所有合理的教学环境中,它是固定宽度(当我们包括沙文脚本时,我们可能需要使用UTF-32))。您只需在输入/输出流中嵌入适当的codecvt方面,即可进行自动翻译。在内部,可以将代码作为单个字符使用wchar类型进行操作。

字符串是字符的容器,仅为一个字节。它应仅用于Ascii字符串或二进制数据。 任何不在本例中的内容都应该使用Unicode,使用wstring,一个用于wchar\u t的容器


但是Unicode文本的编码方式问题仍然存在,请参见上面的答案。

字符串是字符的容器,只有一个字节。它应该只用于Ascii字符串或二进制数据。 任何不在本例中的内容都应该使用Unicode,使用wstring,一个用于wchar\u t的容器


但是Unicode文本的编码方式问题仍然存在,请参见上面的答案。

该文件是UTF-8编码的。使用Unicode库,如访问代码点:

#include <iostream>
#include <fstream>
#include <utility>

#include "unicode/utf.h"

using namespace std;

const pair<UChar32, int32_t>
getFirstUTF8CodePoint(const string& str) {
  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(str.data());
  const int32_t length = str.length();
  int32_t offset = 0;
  UChar32 cp = 0;
  U8_NEXT(ptr, offset, length, cp);
  return make_pair(cp, offset);
}

int main(void)
{
    ifstream in("file.txt");
    string line;
    while (getline(in, line))
    {
      pair<UChar32, string::size_type> cp = getFirstUTF8CodePoint(line);
      cout << line << "    starts with char: " << line.substr(0, cp.second) << " " << static_cast<unsigned long>(cp.first) << endl;
    }
    in.close();
    return 0;
}
#包括
#包括
#包括
#包括“unicode/utf.h”
使用名称空间std;
常数对
getFirstUTF8CodePoint(常量字符串和字符串){
const uint8_t*ptr=重新解释强制转换(str.data());
常量int32_t length=str.length();
int32_t offset=0;
UChar32 cp=0;
U8_下一步(ptr、偏移、长度、cp);
返回make_对(cp,offset);
}
内部主(空)
{
ifstream in(“file.txt”);
弦线;
while(getline(in,line))
{
对cp=getFirstUTF8CodePoint(线);

cout该文件是UTF-8编码的。使用Unicode库(如)访问代码点:

#include <iostream>
#include <fstream>
#include <utility>

#include "unicode/utf.h"

using namespace std;

const pair<UChar32, int32_t>
getFirstUTF8CodePoint(const string& str) {
  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(str.data());
  const int32_t length = str.length();
  int32_t offset = 0;
  UChar32 cp = 0;
  U8_NEXT(ptr, offset, length, cp);
  return make_pair(cp, offset);
}

int main(void)
{
    ifstream in("file.txt");
    string line;
    while (getline(in, line))
    {
      pair<UChar32, string::size_type> cp = getFirstUTF8CodePoint(line);
      cout << line << "    starts with char: " << line.substr(0, cp.second) << " " << static_cast<unsigned long>(cp.first) << endl;
    }
    in.close();
    return 0;
}
#包括
#包括
#包括
#包括“unicode/utf.h”
使用名称空间std;
常数对
getFirstUTF8CodePoint(常量字符串和字符串){
const uint8_t*ptr=重新解释强制转换(str.data());
常量int32_t length=str.length();
int32_t offset=0;
UChar32 cp=0;
U8_下一步(ptr、偏移、长度、cp);
返回make_对(cp,offset);
}
内部主(空)
{
ifstream in(“file.txt”);
弦线;
while(getline(in,line))
{
对cp=getFirstUTF8CodePoint(线);

这可能也有帮助,你可以发布一个使用
codevt
facet从UTF-8转换到
wchar\u t
的例子吗?找到了boost的东西。虽然它看起来像beta代码:这可能也有帮助。你可以发布一个使用
codevt
facet从UTF-8转换到
wchar\u t
的例子吗?找到了boost东西。虽然它看起来像beta代码:
std::string
可以存储Unicode字符串,如果您使用适当的编码,例如UTF-8。Unicode不是一种编码。虽然可能,但这不是很好,因为您不能可靠地使用[0]。构建抽象(字符而不是字节)有什么意义如果你这么不正确地使用它们?
std::