c++如何通过utf8字符串编码的文件名,在windows上打开一个文件

办不到!!!

windows只接受8bit的ANSI或者UTF16编码的文件名,你可以在代码里面使用utf8编码的文件名,但是当你打开文件时,你必须将其转化为8bit的ANSI或者UTF16编码的文件名。
幸运的是,VC++的std::ifstream 跟 std::ofstream对标准做了扩展,他们的构造函数跟open()方法可以接受wchat_t*的字符串(utf16编码的)。

下面提供一种基于VC++的扩展的兼容windows的方案:

#ifdef _MSC_VER
std::wstring ToUtf16(std::string str)
{
    std::wstring ret;
    int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0);
    if (len > 0)
    {
        ret.resize(len);
        MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), &ret[0], len);
    }
    return ret;
}
#endif

int main()
{
    std::string utf8path = ...;
    std::ifstream iFileStream(
        #ifdef _MSC_VER
        ToUtf16(utf8path).c_str()
        #else
        utf8path.c_str()
        #endif
        , std::ifstream::in | std::ifstream::binary);
    ...
    return 0;
}

原文地址:https://www.cnblogs.com/ConfuciusPei/p/12344640.html

时间: 2024-10-21 23:49:01

c++如何通过utf8字符串编码的文件名,在windows上打开一个文件的相关文章

[C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串

作者:zyl910 如今,UTF-8字符串的使用频率越来越多了.但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串.宽字符串.TCHAR字符串相互转换的代码.不仅费时费力,而且稍不留心就容易造成内存泄露问题.于是我便想专门编写个库来解决UTF-8字符串编码问题. 特性——支持 TCHAR,能随时切换项目字符集配置.兼容 32位(x86)与64位(x64)Windows环境.兼容 VC2005 及更高版本的 VC. 一.设计思路 ATL中的字符串转换宏用起来很方便,于是我打

Python学习第三天之字符串编码解码,集合,文件,函数

1数据类型--集合 初始化 list = [ 1, 2,3,4,5 ] set1 = set ( list ) 集合的逻辑关系 求交集: set3 = set1.intersection(set2)  或者  set3 = set1 & set2 求并集:set1.union(set2)  或者 set1 | set2 求差集:set6 = set1.difference(set2)  或者  set6 = set1 - set2 set5 = set2.difference(set1) 或者

一篇文章助你理解Python3中字符串编码问题

前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解Python2中字符串编码问题.下面在Python3环境中进行代码演示,分别Windows和Linux操作系统下进行演示,以加深对字符串编码的理解. 在Python2的Python文件的文件头往往会声明字符的编码格式,通过会使用代码"#-*- coding -*-"作为编码声明,如下图所示

Python 读取文件下所有内容、获取文件名、截取字符、写回文件

# coding=gbk import os import os.path   #读取目录下的所有文件,包括嵌套的文件夹 def GetFileList(dir, fileList): newDir = dir if os.path.isfile(dir): fileList.append(dir) elif os.path.isdir(dir): for s in os.listdir(dir): # 如果需要忽略某些文件夹,使用以下代码 # if s == "xxx": # con

UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理

一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111.上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今.ASCII码一共规定了128个字符的

c++字符串编码GBK到UTF8的转换

使用c++跨windows和linux平台实现字符串GBK到UTF8的转换. 原理是GBK字符串先转为unicode编码,然后再转换为UTF8编码. 代码如下: #ifndef __CODE_CONVERT_H__ #define __CODE_CONVERT_H__ #include <cstdio> #include <stdlib.h> #include <locale.h> #include <string> #if defined(_WIN32)

WAMP环境UTF8编码上传中文名文件文件名乱码

测试环境: windows7 php5.5.12 apache2.4.9 form表单 <form action="http://127.0.0.1/" method="post"  enctype="multipart/form-data">     <input type="file" name="MAX_FILE_SIZE" value="1000000" /&g

PHP判断字符串编码是否为utf8以及转换问题

今天说说编码乱码问题,当一个页面存在两种编码的时候,无论你乍么选择都会出现乱码,解决方法: 1.你据在网页编码是哪个. 2.首先判断字符串编码是否为utf8代码如下: PHP代码 function is_utf8($word) { if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128

python 字符串编码 str和unicode 区别以及相互转化 decode(&#39;utf-8&#39;) encode(&#39;utf-8&#39;)

python 字符串编码 str和unicode 区别以及相互转化 decode('utf-8') encode('utf-8') 原文地址:https://www.cnblogs.com/zhaoyingjie/p/9133020.html