C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- std::filesystem::path
- std::filesystem::file_time_type
- std::filesystem::path::empty
- std::filesystem::u8path
- std::filesystem::filesystem_error
- std::filesystem::directory_entry
- std::filesystem::directory_iterator
- std::filesystem::recursive_directory_iterator
- std::filesystem::file_status
- std::filesystem::space_info
- std::filesystem::file_type
- std::filesystem::perms
- std::filesystem::perm_options
- std::filesystem::copy_options
- std::filesystem::directory_options
- std::filesystem::absolute
- std::filesystem::canonical, std::filesystem::weakly_canonical
- std::filesystem::relative, std::filesystem::proximate
- std::filesystem::copy
- std::filesystem::copy_file
- std::filesystem::copy_symlink
- std::filesystem::create_directory, std::filesystem::create_directories
- std::filesystem::create_hard_link
- std::filesystem::create_symlink, std::filesystem::create_directory_symlink
- std::filesystem::current_path
- std::filesystem::exists
- std::filesystem::equivalent
- std::filesystem::file_size
- std::filesystem::hard_link_count
- std::filesystem::last_write_time
- std::filesystem::permissions
- std::filesystem::read_symlink
- std::filesystem::remove, std::filesystem::remove_all
- std::filesystem::rename
- std::filesystem::resize_file
- std::filesystem::space
- std::filesystem::status, std::filesystem::symlink_status
- std::filesystem::temp_directory_path
- std::filesystem::is_block_file
- std::filesystem::is_character_file
- std::filesystem::is_directory
- std::filesystem::is_empty
- std::filesystem::status_known
- std::filesystem::is_fifo
- std::filesystem::is_other
- std::filesystem::is_regular_file
- std::filesystem::is_socket
- std::filesystem::is_symlink
- 注é
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >æä»¶ç³»ç»åº >std::filesystem::path > std::filesystem::u8path
std::filesystem::u8path
ä» UTF-8 ç¼ç ç charæ char8_t (C++20 èµ·) åºåæé path p ï¼æºä½ä¸º std::string æ std::string_view ï¼æç©ºç»æ¢å¤åèåç¬¦ä¸²ï¼æä½ä¸ºä¸å¯¹è¿ä»£å¨ [first, last) æä¾ã
- è¥
path::value_typeæ¯ char ä¸åçç¼ç 为 UTF-8 ï¼åç´æ¥å¦å以 path(source) æ path(first, last) æé path ãè¿æ¯ä½¿ç¨ Unicode ç POSIX ç³»ç»çå ¸åæ åµï¼ä¾å¦ Linux ã - å¦åï¼è¥
path::value_typeæ¯ wchar_t ä¸åçç¼ç æ¯ UTF-16 ï¼è¿æ¯ Windows ä¸çæ åµï¼ï¼æè¥path::value_typeæ¯ char16_t ï¼åçç¼ç ä¿è¯ä¸º UTF-16 ï¼æ char32_t ï¼åçç¼ç ä¿è¯ä¸º
UTF-32ï¼ï¼åé¦å
è½¬æ¢ UTF-8 å符åºå为 path::string_type ç±»åç临æ¶å符串 tmp ï¼ç¶åå¦å以 path(tmp) æé æ° path
- å¦åï¼å¯¹äºé UTF-8 çªå符ç¼ç ä¸é UTF-16 wchar_t ï¼ï¼é¦å
è½¬æ¢ UTF-8 å符åºåå° std::u32string ç±»åçä¸´æ¶ UTF-32 ç¼ç å符串
tmpï¼ç¶åå¦åç¨ path(tmp) æé æ° path ï¼æ¤ path 被éç¨äºä½¿ç¨é Unicode å¤åèæååèç¼ç çæä»¶ç³»ç»ç POSIX ç³»ç»ä¸ï¼
åæ°
| source | - | UTF-8 ç¼ç ç std::string ã std::string_view ï¼æåç©ºç»æ¢å¤åèå符串çæéï¼ææåç©ºç»æ¢å¤åèå符串ç以 char 为 value_type çè¾å ¥è¿ä»£å¨ |
| first, last | - | ä¸å¯¹æå® UTF-8 ç¼ç å符åºåçéçè¾å ¥è¿ä»£å¨ (LegacyInputIterator) |
| ç±»åè¦æ± | ||
-InputIt å¿
须满足éçè¾å
¥è¿ä»£å¨ (LegacyInputIterator) çè¦æ±ã
| ||
-InputIt çå¼ç±»åå¿
é¡»æ¯ char
| ||
è¿åå¼
å°è¾å ¥åç¬¦ä¸²ä» UTF-8 转æ¢å°æä»¶ç³»ç»åçå符ç¼ç åï¼æé çè·¯å¾ã
å¼å¸¸
è¥å ååé 失败åå¯è½æåº std::bad_alloc ã
注解
å¨åçè·¯å¾æ ¼å¼å¼äºéç¨è·¯å¾æ ¼å¼çç³»ç»ä¸ï¼ Windows ä¸ POSIX å䏿¯æ¤ç§ç³»ç»çä¾åï¼ï¼è¥æ¤å½æ°çåæ°ä½¿ç¨éç¨æ ¼å¼ï¼åå®ä¼è¢«è½¬æ¢æåçæ ¼å¼ã
示ä¾
#include <cstdio> #ifdef _MSC_VER #include <io.h> #include <fcntl.h> #else #include <locale> #include <clocale> #endif #include <fstream> #include <iostream> #include <filesystem> namespace fs = std::filesystem;  int main() { #ifdef _MSC_VER _setmode(_fileno(stderr), _O_WTEXT); #else std::setlocale(LC_ALL, ""); std::locale::global(std::locale("")); std::cout.imbue(std::locale()); std::wcerr.imbue(std::locale()); #endif  fs::path p = fs::u8path(u8"è¦ããªã.txt"); std::ofstream(p) << "File contents"; // å¨ LWG2676 å MSVC ä¸ä½¿ç¨ operator string_type() // ï¼å ¶ä¸ string_type æ¯ wstring ï¼ä» æ ¹æ®éæ åæ©å±å·¥ä½ // LWG2676 åä½¿ç¨æ°ç fstream æé 彿°  // åçå符串表示å¯ç¨äº OS API if (std::FILE* f = #ifdef _MSC_VER _wfopen(p.c_str(), L"r") #else std::fopen(p.c_str(), "r") #endif ) { int ch; while((ch=fgetc(f))!= EOF) putchar(ch); std::fclose(f); }  // å¤åèä¸å®½åè表示å¯ç¨äºè¾åº std::cout << "\nFile name in narrow multibyte encoding: " << p.string() << '\n'; std::wcerr << "File name in wide encoding: " << p.wstring() << '\n';  fs::remove(p); }
è¾åºï¼
File contents File name in narrow multibyte encoding: è¦ããªã.txt File name in wide encoding: è¦ããªã.txt
