相关疑难解决方法(0)

为什么 wprintf 在 Linux 上将 Unicode 中的俄语文本音译为拉丁语?

为什么下面的程序

#include <stdio.h>
#include <wchar.h>

int main() {
  wprintf(L"??????, ???!");
}
Run Code Online (Sandbox Code Playgroud)

打印“女贞,先生!” 在 Linux 上?具体来说,为什么它将 Unicode 中的俄语文本音译为拉丁语,而不是将其转码为 UTF-8 或使用替换字符?

在 Godbolt 上演示此行为:https ://godbolt.org/z/36zEcG

非宽版会printf("??????, ???!")按预期打印此文本(“??????, ???!”)。

c linux printf wchar non-ascii-characters

35
推荐指数
2
解决办法
1783
查看次数

在同一个程序中混合cout和wcout

我正在阅读"C++ Cookbook",其中包含以下代码段:

// cout  << s  << std::endl;  // You shouldn't be able to
wcout << ws << std::endl;     // run these at the same time
Run Code Online (Sandbox Code Playgroud)

如果您对查看实际示例感兴趣,可以在此处找到Google图书页面的链接.

此外,我发现这个SO问题似乎表明混合wcout和cout是可以的.有人可以向我解释一下这个评论的内容吗?

编辑

从C++标准[27.4.1]:

对相应的宽字符和窄字符流的混合操作遵循与在FILE上混合此类操作相同的语义,如ISO C标准的修订1中所规定的.

从C标准[7.19.2]:

每个流都有一个方向.在流与外部文件关联之后,但在对其执行任何操作之前,该流没有方向.一旦将宽字符输入/输出功能应用于没有方向的流,该流就变为面向广泛的流.类似地,一旦将字节输入/输出功能应用于没有方向的流,该流就变成面向字节的流.只有调用freopen函数或fwide函数才能改变流的方向.(成功拨打freopen会删除任何方向.)

字节输入/输出功能不应用于面向广泛的流,宽字符输入/输出功能不应用于面向字节的流.

所以,标准似乎说你不应该混合它们.但是,我从这篇文章中找到了这句话:

对于Visual C++ 10.0,fwide函数被记录为未实现.从实际的角度来看,至少在输出整行的水平上,它显然可以很好地混合使用cout和wcout.因此,很高兴,Visual C++显然只是忽视了标准的要求,并没有维护一个不切实际的显式C FILE流方向.

而且,关于gcc,我从这里找到了这个引用:

这是一个(新的)功能,而不是一个bug,请参阅libstdc ++/11705,以及在C标准(C99,7.19)中的流方向搜索.简而言之,您不能混合面向字节和面向广泛的I/O. 目前,由于 libstdc ++/11705中指出的bug,你可以通过调用std :: ios :: sync_with_stdio(false)获得接近你期望的东西.在你的程序的开头.

c++

25
推荐指数
1
解决办法
6614
查看次数

将'wchar_t*'输出到'ofstream'

我想通过我声明的两个指针将文本输出到文件:

wchar_t   *Col1="dsffsd", *Col2="sdfsf";
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

std::ofstream fout;
fout.open(NativeDatabasePathHist);
fout<<"testing";
fout<<" "<<Col1<<" "<<Col2;
fout.close();
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

测试113 113

为什么当我打印Col1Col2,我得到的数字,而不是字符串?

c++ file wchar-t std wofstream

15
推荐指数
1
解决办法
2万
查看次数

WIN32_FIND_DATA FileNAme不会输出文件名,而是放出HEx-Codes

我试图得到一个文件夹中所有文件的完整列表,如下所示:

#include<Windows.h>
#include<iostream>
#include<stdio.h>

using namespace std;

void main()
{
HANDLE dateiHandle;
WIN32_FIND_DATA wfindD;

dateiHandle = FindFirstFile(L"E:\\Roman\\PIC\\funpics\\*", &wfindD);
do
{
    cout << wfindD.cFileName << endl;
} while (FindNextFile(dateiHandle, &wfindD));

FindClose(dateiHandle);
while (1)
{

}
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么结果是这样的:

00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
00AFFCCC
Run Code Online (Sandbox Code Playgroud)

c++ directory winapi

-1
推荐指数
1
解决办法
210
查看次数

标签 统计

c++ ×3

c ×1

directory ×1

file ×1

linux ×1

non-ascii-characters ×1

printf ×1

std ×1

wchar ×1

wchar-t ×1

winapi ×1

wofstream ×1