Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取包含utf-8(印地语)格式文本的文件并写入另一个文件_C++_Visual C++_File Handling_Wchar T_Widechar - Fatal编程技术网

C++ 读取包含utf-8(印地语)格式文本的文件并写入另一个文件

C++ 读取包含utf-8(印地语)格式文本的文件并写入另一个文件,c++,visual-c++,file-handling,wchar-t,widechar,C++,Visual C++,File Handling,Wchar T,Widechar,我试图从文件中读取字符,并在删除标点符号后读取。我想将单词存储在一个数组中,最后将它们写入另一个文件。该文件的内容包括:- “यौ ता बाबू उदयभाहू उपेक्षा औंर अपमान्नकीपीड््ा ढोये जैसेतैस्ये वहबाबाके आश्रम म्पें पहैच गया । बाबा मान्नो उसी की प्रतीक्षा म्पें वैठे थे । वह ज्योही दण्डवत की मुदा म्पें हुभ्रा त्योंही ब

我试图从文件中读取字符,并在删除标点符号后读取。我想将单词存储在一个数组中,最后将它们写入另一个文件。该文件的内容包括:-

यौ ता बाबू उदयभाहू उपेक्षा औंर अपमान्नकीपीड््ा ढोये जैसेतैस्ये वहबाबाके आश्रम म्पें पहैच गया । बाबा मान्नो उसी की प्रतीक्षा म्पें वैठे थे । वह ज्योही दण्डवत की मुदा म्पें हुभ्रा त्योंही बाबा का गभ्रीर स्वर उसके कानों म्पे टकराया ' आभ्रो, ञैं तुम्हारे लिए ही बैठा हूें । ' अमित न्ने मस्तक ऊैंचा उठाया औंर एकाम्र भाव न्से बाबा को देखता रहा । बाबा के पास वह अनेकों बार आ चुका था परन्तु. आज जैसी व्यथा, थकान्न औंर प्तानता इससे दूर्व नहीं थी आदमी कभ्रीकभी इतना टूट ञाता ड़ँ कि ठसे अपने अस्तिल्द के प्रति भ्री शंका होन्ने लगती न्है वह अनेक विचारों म्पें खो गया उसके नेत्र बाबा कौ देख रहे थे परन्तु उस्यका मन कहीं औंर भ्रटक रद्दा था ।"

我尝试使用老Turbo C++读取这些字符(Hydi-UTF-8)。使用简单的char数据类型。

程序已编译,但内容未正确写入文件。 然后在Visual C++中用相同的代码,用相同的代码,得到了错误——


调试断言失败。。。unsigned(c+1)您可以尝试使用。Stdio文件函数,如fwprintf或fputwc,即使使用unicode变体,也可以在内部将输出转换为ASCII。我也有这个问题


但是既然您的编码是UTF-8,为什么不把它读成ASCII码,写成ASCII码呢?UTF-8的编码方式应该使它能够与那些不知道自己在使用UTF-8而不是ASCII的程序一起工作。

我不太清楚你想做什么:你在哪里做的 断言失败发生了吗?您如何确定 字符是否是标点符号

UTF-8是一种多字节编码,这意味着单字节 像
ispunct
这样的函数不适用于它。它是可变长度的 但是,编码和原始ASCII代码中的所有字符 集合具有单字节编码。如果你是唯一的标点符号 与原始ASCII中的字符有关,您可以 “欺骗”一点,并使用类似于:

if ( (ch & 0x80) == 0 && ispunct( ch ) ) {
    //  is ASCII punctuation
} else {
    //  is something else
}
我在引号中加上“作弊”,因为Unicode的目标之一 UTF-8是查找ASCII标点符号之类的代码 应该保持不变

如果您需要识别的不仅仅是ASCII点状符号(例如 例如
«
-
),您希望使用
wchar\t
(通常是,但不总是UTF-16或UTF-32),文件是 UTF-8,您需要使用适当的区域设置来执行代码 翻译在这种情况下,您肯定应该使用iostream,并且 不是C风格的IO;iostream将允许您在流中注入 适当的区域设置和C++区域设置将允许您创建 通过将单个方面(
codevt
,在本例中)从 另一个区域设置(可能是全局区域设置)。(在Linux下,全局 区域设置,特别是在非英语地区,通常是UTF-8 语言环境,可以直接使用。在Windows下,我希望它 是UTF-16语言环境,无法正确翻译UTF-8。)如果 如果不想涉及到地区,请将您的UTF-8直接读入
char
缓冲区,并使用
iconv
库或类似于 在你的程序中翻译它。但是,请注意,可能存在 在基本平面之外有一些罕见的标点符号 使用UTF-16中的两个代理字符进行编码<代码>iswpunct将不会 如果您的
wchar\u t
使用UTF-16(Windows和AIX),则可以使用这些工具。(大多数 基本平面以外的字符中有一个是CJK或来自历史
脚本目前未使用,因此这可能不是您的问题。)

您应该尝试将该链接总结到您的答案中。只有链接的答案有被标记和删除的趋势。你能正确缩进你的代码吗?@satuon。。。我已经缩进了代码…检查内部while循环中的代码…通常
中的
isxxx
函数不适用于UTF-8(或任何多字节编码)。还有一个问题是,他们在
0…UCHAR_MAX
范围内使用
int
,并且普通的
char
通常是有符号的。而
fputwc
等的代码翻译应该取决于全局区域设置(或者打开时是全局区域设置)。对于标准ASCII以外的任何内容,我强烈建议使用iostream,在iostream中,您可以为每个流注入它所需的语言环境。(C++中的区域设置不是特别容易使用,但它是存在的)。当我尝试使用CHAR数据类型变量读取UTF-8(Hydii语言)字符时,出现了“调试断言失败”。但当我使用wchar__t用于相同的目的(如代码中所述)时。。程序编译成功,但输出中存在一些问题
if ( (ch & 0x80) == 0 && ispunct( ch ) ) {
    //  is ASCII punctuation
} else {
    //  is something else
}