C 17 怎樣優雅的進行gbk utf 8字元編碼互轉?

時間 2021-05-30 00:45:36

1樓:cqwrteur

用我的fast_io庫

C++ 流淘汰了, OOP淘汰了。fmt,charconv,C++23網路一類的都是淘汰貨。現在流行fast_io和C with Concepts!!!

記住。C++所有與流和locale相關的都是執行緒不安全的。locale有害。

#include

"../../include/fast_io_locale/iconv.h"

#include

"../../include/fast_io.h"

intmain

(int

argc

,char

**argv

)try

autot0;

std::

size_t

transmitted

{};println(u8

"UTF8 => GB18030 code cvt (with POSIX iconv system) success!

\nTransmitted:"

,transmitted,u8

" bytes

\nElapsed Time:"

,std

::chrono

::high_resolution_clock

::now()-

t0);

}catch

(std

::exception

const&e

)過段時間我會專門寫乙個GBK和UTF互轉的東西。現在只有用iconv了。不過UTF8-UTF16,UTF32都是用的SSE指令+自動機。

2樓:王扶之

幾個派生類棄用了,但std::codecvt 本身還可以用。

既然是 gbk,預設使用 Windows,總結一下幾類標準方法。(mingw w64 就不要想了, locale 只支援 "", "POSIX", "C"。)

首先 C 的 wcsrtombs, mbsrtowcs 這類方法表現不正常,而且動全域性 locale 影響較大,建議不要使用。

std:codecvt的特化,std::codecvt跟std::codecvt_byname都可以用,當然直接轉沒辦法,需要用寬字符集中轉一下。

首先轉 wchar_t,有兩種辦法

codecvt 析構函式沒法訪問,繼承之後再用,如

template

CodecvtFacet

>struct

valid_codecvt

:CodecvtFacet

~valid_codecvt

(){}

};valid_codecvt

codecvt_byname

>converter

;char

gbk_str

="......"

;std

::mbstate_t

mb{};

wchar_t

wstr

[buf_size

];const

char

*from_next

;wchar_t

*to_next

;converter.in

(mb,gbk

,gbk

+src_size

,from_next

,wstr

,wstr

+buf_size

,to_next);*

to_next=L

'\0'

;2. imbuess.

imbue

(std

::locale(ss

.getloc

(),new

std::

codecvt_byname

,char

,std

::mbstate_t

>("zh_CN.gbk"

)));

然後 wchar_t 轉 utf8,同樣的方法使用std::codecvt,linux 第乙個模板形參用 char32_t,C++20 第二個模板形參用 char8_t。

另外,C++ 17 有乙個歪門邪道

usingfs=

filesystem

;string

gbk_str;fs

::path

path

;u8string

utf_str

=path

.u8string();

3樓:XZiar

用ICU,跨平台的。

site.icu-project.org/windows現在都自帶ICU了。

或者如果你不想依賴第三方庫的話,把那幾個deprecated的warning給關掉咯。

(實在想不開的,自己寫乙份質量更差的)

如何評價C 17中的新特性fold expression?

不知道為啥這麼多人反對。雖然。有些複雜不直觀。而且功能不強大,還完全可以通過其他方式代替,同時其他方式的實現還可以完成更多的功能。但是至少這種方法寫起來稍微。短那麼一些。 原子筆 C 標準委員會,只需引入乙個別的指令碼語言,放預處理後編譯期前去解釋執行,就可以簡單解決這些各種問題 巨集的功能太弱,但...

C 17 有哪些值得注意的新特性?

努力保持清醒的 最近一向有關TIOBE 程式設計言語排行榜,C 好像不進反退,不知為什麼會是這樣呢。話說C 寫起來感覺很不錯嘛,不知我們什麼感覺。turbo c 是老古董了,是DOS時代的C言語編譯器。Visual c 主要是用來編譯c 的,當然對c言語也是相容的。不過個人主張不要用Visual c...

怎麼看待 C 17 眾多功能的流產?

nouness 我猜上面說asio效能爛的都是使用姿勢問題 如果你是單個io service配合多執行緒使用的,那恭喜你,效能和併發上不去是正常的,io service裡有個鎖,是這個東東導致單個io service併發無法隨著執行緒增加而增加 高併發的使用姿勢是多個io service配合多執行緒...