2011-06-22 38 views
0

有没有人知道在Linux g ++中是否存在等价的MSVC _wrename? (cstdio文件相当于重命名使用常量为wchar_t的*代替为const char *作为参数类型的Unicode使用功能)等价的MSVC++ _wrename在Linux g ++中?

谢谢!

+0

我的mingw-w64 CRT拷贝有这个。或者你正在寻找一个Linux/POSIX的替代品? – rubenvb

+0

我正在寻找一个linux替代品,我应该已经精简。感谢您的回复:) – Juicebox

回答

0

这是平台特定的。恐怕你必须以某种方式将你的const wchar_t *转换为const char *。在Linux上,我认为你可以使用iconv功能。

编辑:加速可能有东西给这个

+0

确实,我没有考虑过Boost,但它似乎在文件系统库中有类似的东西。我检查它并说出它是否符合我的需要。谢谢。 – Juicebox

+0

C++标准(直到0x)根本不处理Unicode。 “char”和“wchar_t”几乎都是未指定的,并且与Unicode(或“字符”,就此而言)无关。 – Philipp

+0

@Philipp:那么wstring呢? –

3

的一点是,大多数文件系统等比NTFS存储其字节 -strings文件名。通常没有明确的编码概念,但文件名必须是由零终止的非零字节的字符串。所以在所有这样的系统中,文件系统函数只需要char*参数文件名,并且您必须自己指出如何处理编码问题(如果有的话)。

Windows是特殊的,因为NTFS中的文件名是以16位为单位的空终止字符串。这与Windows上的16位wchar_t类型以及各种_w*文件系统功能并行不悖。

+0

非常有趣的感谢。还有一些我没有得到的东西。在Linux上,当使用stdio重命名时,系统如何知道我们传递了一个ascii 8位字符串或一个编码的unicode 16位字符串(作为简单的8位字符串传递)? (我不知道我的问题是否清楚......) – Juicebox

+1

@Juicebox:我知道的文件系统没有编码的概念。只要你认为是正确的文件名就可以通过它们。顺便说一句,没有“8位ASCII”或“unicode 16位字符串”之类的东西。你可能意思是别的。 –

+1

作为推论,大多数文件系统没有包含文件名的“字符”的概念,只有“代码单元”。你不能完全普遍地要求“这个文件名有多少个字符”(例如一个文件名可能包含一个流氓Unicode代理)。这只是一串字节与“由字符组成的文本”的概念之间的根本区别。前者非常容易,后者非常困难。 –