C ++開發人員仍然錯過了一種處理Unicode編碼字符串的簡單和便攜式方式。原始的C ++標準(稱為C ++ 98或C ++ 03)是Unicode不可知的。後來的標準版本已經取得了一些進展,但是僅使用標准設施與Unicode合作仍然很難。
我想出了一個小型的C ++ 98兼容的通用庫,以處理UTF-8編碼的字符串。對於任何與STL算法和迭代器一起使用的人,它應該很容易使用。該代碼可供任何目的免費使用 - 查看許可證。自2006年首次發行以來,該圖書館在商業和開源項目中都被使用了很多,並且被證明是穩定且有用的。
這是一個僅標題庫,部署它的支持方式是:
cmakelist.txt文件最初僅用於測試目的,但不幸的是,隨著時間的流逝,我接受了添加了安裝目標的貢獻。這不是安裝UTFCPP庫的支持方式,我正在考慮在以後的版本中刪除cmakelist.txt。
為了說明庫的使用,讓我們從一個小但完整的程序開始,該程序打開包含UTF-8編碼文本的文件,按行讀取IT,檢查無效的UTF-8字節序列的每一行,然後將其轉換為UTF-16編碼,然後返回到RECKF-8:
# include < fstream >
# include < iostream >
# include < string >
# include < vector >
# include " utf8.h "
using namespace std ;
int main ( int argc, char ** argv)
{
if (argc != 2 ) {
cout << " n Usage: docsample filename n " ;
return 0 ;
}
const char * test_file_path = argv[ 1 ];
// Open the test file (must be UTF-8 encoded)
ifstream fs8 (test_file_path);
if (!fs8. is_open ()) {
cout << " Could not open " << test_file_path << endl;
return 0 ;
}
unsigned line_count = 1 ;
string line;
// Play with all the lines in the file
while ( getline (fs8, line)) {
// check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)
# if __cplusplus >= 201103L // C++ 11 or later
auto end_it = utf8::find_invalid (line. begin (), line. end ());
# else
string::iterator end_it = utf8::find_invalid (line. begin (), line. end ());
# endif // C++ 11
if (end_it != line. end ()) {
cout << " Invalid UTF-8 encoding detected at line " << line_count << " n " ;
cout << " This part is fine: " << string (line. begin (), end_it) << " n " ;
}
// Get the line length (at least for the valid part)
int length = utf8::distance (line. begin (), end_it);
cout << " Length of line " << line_count << " is " << length << " n " ;
// Convert it to utf-16
# if __cplusplus >= 201103L // C++ 11 or later
u16string utf16line = utf8::utf8to16 (line);
# else
vector< unsigned short > utf16line;
utf8::utf8to16 (line. begin (), end_it, back_inserter (utf16line));
# endif // C++ 11
// And back to utf-8;
# if __cplusplus >= 201103L // C++ 11 or later
string utf8line = utf8::utf16to8 (utf16line);
# else
string utf8line;
utf8::utf16to8 (utf16line. begin (), utf16line. end (), back_inserter (utf8line));
# endif // C++ 11
// Confirm that the conversion went OK:
if (utf8line != string (line. begin (), end_it))
cout << " Error in UTF-16 conversion at line: " << line_count << " n " ;
line_count++;
}
return 0 ;
}在上一個代碼樣本中,對於每行,我們用find_invalid進行了無效的UTF-8序列的檢測;通過使用utf8::distance確定字符的數量(更準確地說 - UNICODE代碼點的數量,包括線的結束,甚至是BOM的結尾)。最後,我們將每行轉換為使用utf8to16編碼的UTF-16,並使用utf16to8轉換為UTF-8。
請注意舊編譯器的不同使用模式。例如,這就是我們將UTF-8編碼的字符串轉換為使用PRE-C ++ 11編譯器編碼的UTF-16的字符串:
vector< unsigned short > utf16line;
utf8::utf8to16 (line.begin(), end_it, back_inserter(utf16line));使用更現代的編譯器,相同的操作看起來像:
u16string utf16line = utf8::utf8to16(line);如果__cplusplus宏指向C ++ 11或更高版本,則該庫將曝光考慮C ++標準Unicode字符串並移動語義的API。使用較舊的編譯器,仍然可以使用相同的功能,只是以一些方便的方式使用
如果您不信任__cplusplus宏或例如,即使使用現代編譯器,也不想包含C ++ 11個助手功能,則在包括utf8.h之前定義UTF_CPP_CPLUSPLUS宏,並為其分配了它的值,並為您要使用的標準 - 與__cplusplus相同。這對於保守的編譯器也很有用,即使它們對最近的標準版有很好的支持-Microsoft的Visual C ++是一個示例,即使它們對__cplusplus宏有很好的支持。
這是一個函數,可以檢查文件的內容是否有效UTF-8編碼文本,而無需將內容讀取到內存:
bool valid_utf8_file ( const char * file_name)
{
ifstream ifs (file_name);
if (!ifs)
return false ; // even better, throw here
istreambuf_iterator< char > it (ifs. rdbuf ());
istreambuf_iterator< char > eos;
return utf8::is_valid (it, eos);
}由於函數utf8::is_valid()可與輸入迭代器一起使用,因此我們能夠將istreambuf_iterator傳遞給it ,並直接讀取文件的內容而無需將其加載到內存。
請注意,其他採用輸入迭代參數的功能可以以類似的方式使用。例如,要讀取UTF-8編碼的文本文件的內容並將文本轉換為UTF-16,請執行以下操作:
utf8::utf8to16 (it, eos, back_inserter(u16string));如果我們有一些“可能”包含UTF-8編碼文本的文本,並且我們希望用替換字符替換任何無效的UTF-8序列,則可以使用以下功能:
void fix_utf8_string (std::string& str)
{
std::string temp;
utf8::replace_invalid (str. begin (), str. end (), back_inserter (temp));
str = temp;
}該函數將用Unicode替換字符替換任何無效的UTF-8序列。有一個超載功能,使呼叫者能夠提供自己的替換字符。
圖書館的設計為:
對於替代方案和比較,我建議以下文章:Jeanheyd Meneide撰寫的C和C ++編碼API的奇妙世界。在文章中,該庫與以下內容進行了比較:
本文介紹了作者對API設計質量的看法,但也介紹了一些速度基準。
可在1.0版和更高版本中提供。
將32位代碼點編碼為UTF-8序列序列,並將序列附加到UTF-8字符串上。
template < typename octet_iterator>
octet_iterator append ( utfchar32_t cp, octet_iterator result); octet_iterator :輸出迭代器。
cp :一個32位整數,代表代碼點以附加到序列。
result :輸出迭代器到序列中的位置附加代碼點的位置。
返回值:迭代器指向新附加序列之後的位置。
使用的示例:
unsigned char u[ 5 ] = { 0 , 0 , 0 , 0 , 0 };
unsigned char * end = append( 0x0448 , u);
assert (u[ 0 ] == 0xd1 && u[ 1 ] == 0x88 && u[ 2 ] == 0 && u[ 3 ] == 0 && u[ 4 ] == 0 );請注意, append不會分配任何內存 - 這是呼叫者的負擔,以確保分配足夠的內存以進行操作。為了使事情變得更有趣, append可以在序列中添加1到4個八位字之間的任何位置。在實踐中,您通常需要使用std::back_inserter來確保分配必要的內存。
如果是無效的代碼點,則拋出utf8::invalid_code_point 。
在版本3.0和更高版本中可用。在4.0之前,它需要C ++ 11編譯器;用4.0提起要求。
將32位代碼點編碼為UTF-8序列序列,並將序列附加到UTF-8字符串上。
void append ( utfchar32_t cp, std::string& s); cp :一個代碼點,用於附加到字符串。
s :一個UTF-8編碼的字符串,以將代碼點附加到。
使用的示例:
std::string u;
append ( 0x0448 , u);
assert (u[ 0 ] == char ( 0xd1 ) && u[1] == char( 0x88 ) && u.length() == 2);如果是無效的代碼點,則拋出utf8::invalid_code_point 。
在4.0版和更高版本中可用。
編碼一個32位代碼點作為UTF-16單詞序列,並將序列附加到UTF-16字符串上。
template < typename word_iterator>
word_iterator append16 ( utfchar32_t cp, word_iterator result); word_iterator :輸出迭代器。
cp :一個32位整數,代表代碼點以附加到序列。
result :輸出迭代器到序列中的位置附加代碼點的位置。
返回值:迭代器指向新附加序列之後的位置。
使用的示例:
unsigned short u[ 2 ] = { 0 , 0 };
unsigned short * end = append16( 0x0448 , u);
assert (u[ 0 ] == 0x0448 && u[ 1 ] == 0 );請注意, append16不會分配任何內存 - 確保分配足夠的內存用於操作是呼叫者的負擔。為了使事情變得更有趣, append16可以在序列中添加一個或兩個單詞。在實踐中,您通常需要使用std::back_inserter來確保分配必要的內存。
如果是無效的代碼點,則拋出utf8::invalid_code_point 。
在4.0版和更高版本中可用。需要C ++ 11兼容的編譯器。
編碼一個32位代碼點作為UTF-16單詞序列,並將序列附加到UTF-16字符串上。
void append ( utfchar32_t cp, std::u16string& s); cp :一個代碼點,用於附加到字符串。
s :一個UTF-16編碼的字符串,以將代碼點附加到。
使用的示例:
std::u16string u;
append ( 0x0448 , u);
assert (u[ 0 ] == 0x0448 && u.length() == 1);如果是無效的代碼點,則拋出utf8::invalid_code_point 。
可在1.0版和更高版本中提供。
給定迭代器到UTF-8序列的開頭,它返回代碼點並將迭代器移至下一個位置。
template < typename octet_iterator>
utfchar32_t next (octet_iterator& it, octet_iterator end); octet_iterator :輸入迭代器。
it :指向UTF-8編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向下一個代碼點的開始。
end :要處理的UTF-8序列的結尾。 end it則會拋出utf8::not_enough_room exception。
返回值:處理後的UTF-8代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars;
int cp = next(w, twochars + 6 );
assert (cp == 0x65e5 );
assert (w == twochars + 3 );此功能通常用於通過UTF-8編碼的字符串迭代。
如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
在4.0版和更高版本中可用。
給定迭代器到UTF-16序列的開頭,它返回代碼點並將迭代器移至下一個位置。
template < typename word_iterator>
utfchar32_t next16 (word_iterator& it, word_iterator end); word_iterator :輸入迭代器。
it :指向UTF-16編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向下一個代碼點的開始。
end :要處理的UTF-16序列的結尾。 end it則會拋出utf8::not_enough_room exception。
返回值:處理後的UTF-16代碼點的32位表示。
使用的示例:
const unsigned short u[ 3 ] = { 0x65e5 , 0xd800 , 0xdf46 };
const unsigned short * w = u;
int cp = next16(w, w + 3 );
assert (cp, 0x65e5 );
assert (w, u + 1 );此功能通常用於通過UTF-16編碼的字符串迭代。
如果是無效的UTF-16序列,則會引發utf8::invalid_utf8異常。
可在2.1版和更高版本中提供。
給定迭代器到UTF-8序列的開頭,它返回以下序列的代碼點,而無需更改迭代器的值。
template < typename octet_iterator>
utfchar32_t peek_next (octet_iterator it, octet_iterator end); octet_iterator :輸入迭代器。
it :指向UTF-8編碼代碼點開始的迭代器。
end :要處理的UTF-8序列的結尾。 end it則會拋出utf8::not_enough_room exception。
返回值:處理後的UTF-8代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars;
int cp = peek_next(w, twochars + 6 );
assert (cp == 0x65e5 );
assert (w == twochars);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
可在版本1.02和更高版本中提供。
給定對指向UTF-8序列中八位字的迭代器的引用,它降低了迭代器,直到達到了先前的UTF-8編碼代碼點的開始並返回代碼點的32位表示。
template < typename octet_iterator>
utfchar32_t prior (octet_iterator& it, octet_iterator start); octet_iterator :雙向迭代器。
it :指向UTF-8編碼字符串中八位位的引用。函數返回後,將其降低至指向上一個代碼點的開始。
start :一個迭代器到搜索代碼點開始的序列的開頭。這是一種安全措施,以防止在搜索UTF-8鉛八位位時通過字符串的開頭。
返回值:上一個代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
unsigned char * w = twochars + 3 ;
int cp = prior (w, twochars);
assert (cp == 0x65e5 );
assert (w == twochars);該功能有兩個目的:一個是通過UTF-8編碼的字符串向後兩個迭代。請注意,通常是一個更好的主意,因為utf8::next速度更快。第二目的是如果我們在字符串中具有隨機位置,則找到UTF-8序列的開始。請注意,在這種情況下utf8::prior在某些情況下可能無法檢測到無效的UTF-8序列:例如,如果有多餘的軌八位,它將跳過它們。
it通常會指向代碼點的開始,並且start將指向字符串的開頭,以確保我們不會向後走得太遠。 it會降低,直到指向鉛UTF-8八位位,然後以該八位位開始為32位表示並返回的UTF-8序列。
如果在擊中UTF-8 LEAD OCTAT之前就可以到達start ,或者如果鉛OCTET啟動了無效的UTF-8序列,則會拋出invalid_utf8異常。
如果start等於it ,則會拋出一個not_enough_room異常。
可在1.0版和更高版本中提供。
通過UTF-8序列中指定數量的代碼點來推進迭代器。
template < typename octet_iterator, typename distance_type>
void advance (octet_iterator& it, distance_type n, octet_iterator end); octet_iterator :輸入迭代器。
distance_type :一種積分類型轉換為octet_iterator的差異類型。
it :指向UTF-8編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向以下代碼點的第n個。
n :代碼點的數量it提高。負值意味著減少。
end :要處理的UTF-8序列的限制。如果n是正的,並且在提取代碼點期間it end ,則會拋出utf8::not_enough_room異常。如果n是負的,並且it指向UTF-8序列的TA軌道字節時it end ,則拋出utf8::invalid_code_point exception。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
unsigned char * w = twochars;
advance (w, 2 , twochars + 6 );
assert (w == twochars + 5 );
advance (w, - 2 , twochars);
assert (w == twochars);如果是無效的代碼點,則拋出utf8::invalid_code_point 。
可在1.0版和更高版本中提供。
給定迭代器以序列為兩個UTF-8編碼的代碼點,返回它們之間的代碼點的數量。
template < typename octet_iterator>
typename std::iterator_traits<octet_iterator>::difference_type distance (octet_iterator first, octet_iterator last); octet_iterator :輸入迭代器。
first :迭代器到UTF-8編碼代碼點的開始。
last :在我們試圖確定長度的序列中,最後一個UTF-8編碼代碼點的“後端”迭代器。它可以是新代碼點的開始。
在代碼點以迭代器之間的距離返回值。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
size_t dist = utf8::distance(twochars, twochars + 5 );
assert (dist == 2 );此功能用於查找UTF-8編碼字符串的長度(在代碼點)。它被稱為距離的原因,而不是長度是主要是因為使用了長度是O(1)函數。計算UTF-8字符串的長度是線性操作,在std::distance算法之後對其進行建模看起來更好。
如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。如果last沒有指出UTF-8序列的過去,則會拋出utf8::not_enough_room Exception。
可在1.0版和更高版本中提供。
將UTF-16編碼的字符串轉換為UTF-8。
template < typename u16bit_iterator, typename octet_iterator>
octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); u16bit_iterator :輸入迭代器。
octet_iterator :輸出迭代器。
start :指向UTF-16編碼字符串的開始的迭代器要轉換。
end :指向通過UTF-16編碼字符串的末端的迭代器進行轉換。
result :輸出迭代器到UTF-8字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-8字符串之後的位置。
使用的示例:
unsigned short utf16string[] = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
vector< unsigned char > utf8result;
utf16to8 (utf16string, utf16string + 5 , back_inserter(utf8result));
assert (utf8result.size() == 10); 在無效的UTF-16序列的情況下,拋出了utf8::invalid_utf16異常。
在版本3.0和更高版本中可用。需要C ++ 11兼容的編譯器。
將UTF-16編碼的字符串轉換為UTF-8。
std::string utf16to8 ( const std::u16string& s); s :UTF-16編碼字符串。返回值:UTF-8編碼字符串。
使用的示例:
u16string utf16string = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
string u = utf16to8(utf16string);
assert (u.size() == 10);在無效的UTF-16序列的情況下,拋出了utf8::invalid_utf16異常。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
將UTF-16編碼的字符串轉換為UTF-8。
std::string utf16to8 (std::u16string_view s); s :UTF-16編碼字符串。返回值:UTF-8編碼字符串。
使用的示例:
u16string utf16string = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
u16string_view utf16stringview (u16string);
string u = utf16to8(utf16string);
assert (u.size() == 10);在無效的UTF-16序列的情況下,拋出了utf8::invalid_utf16異常。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-16編碼的字符串轉換為UTF-8。
std::u8string utf16tou8 ( const std::u16string& s); s :UTF-16編碼字符串。返回值:UTF-8編碼字符串。
使用的示例:
u16string utf16string = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
u8string u = utf16tou8(utf16string);
assert (u.size() == 10);在無效的UTF-16序列的情況下,拋出了utf8::invalid_utf16異常。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-16編碼的字符串轉換為UTF-8。
std::u8string utf16tou8 ( const std::u16string_view& s); s :UTF-16編碼字符串。返回值:UTF-8編碼字符串。
使用的示例:
u16string utf16string = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
u16string_view utf16stringview (u16string);
u8string u = utf16tou8(utf16string);
assert (u.size() == 10);在無效的UTF-16序列的情況下,拋出了utf8::invalid_utf16異常。
可在1.0版和更高版本中提供。
將UTF-8編碼字符串轉換為UTF-16
template < typename u16bit_iterator, typename octet_iterator>
u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); octet_iterator :輸入迭代器。
u16bit_iterator :輸出迭代器。
start :指向UTF-8編碼字符串的開頭的迭代器要轉換。 end :迭代器指向傳遞UTF-8編碼字符串的末端進行轉換。
result :輸出迭代器到UTF-16字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-16字符串之後的位置。
使用的示例:
char utf8_with_surrogates[] = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
vector < unsigned short > utf16result;
utf8to16 (utf8_with_surrogates, utf8_with_surrogates + 9 , back_inserter(utf16result));
assert (utf16result.size() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。如果end沒有指向UTF-8序列的過去,則會拋出utf8::not_enough_room Exception。
在版本3.0和更高版本中可用。需要C ++ 11兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-16。
std::u16string utf8to16 ( const std::string& s); s :一個用於轉換的UTF-8編碼字符串。
返回值:UTF-16編碼字符串
使用的示例:
string utf8_with_surrogates = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
u16string utf16result = utf8to16(utf8_with_surrogates);
assert (utf16result.length() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-16。
std::u16string utf8to16 (std::string_view s); s :一個用於轉換的UTF-8編碼字符串。
返回值:UTF-16編碼字符串
使用的示例:
string_view utf8_with_surrogates = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
u16string utf16result = utf8to16(utf8_with_surrogates);
assert (utf16result.length() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-16。
std::u16string utf8to16 (std::u8string& s); s :一個用於轉換的UTF-8編碼字符串。
返回值:UTF-16編碼字符串
使用的示例:
std::u8string utf8_with_surrogates = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
std::u16string utf16result = utf8to16(utf8_with_surrogates);
assert (utf16result.length() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-16。
std::u16string utf8to16 (std::u8string_view& s); s :一個用於轉換的UTF-8編碼字符串。
返回值:UTF-16編碼字符串
使用的示例:
std::u8string utf8_with_surrogates = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
std::u8string_view utf8stringview {utf8_with_surrogates}
std::u16string utf16result = utf8to16(utf8stringview);
assert (utf16result.length() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
可在1.0版和更高版本中提供。
將UTF-32編碼的字符串轉換為UTF-8。
template < typename octet_iterator, typename u32bit_iterator>
octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); octet_iterator :輸出迭代器。
u32bit_iterator :輸入迭代器。
start :指向UTF-32編碼字符串的開始的迭代器要轉換。
end :指向將UTF-32的字符串傳遞到末端的迭代器要轉換。
result :輸出迭代器到UTF-8字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-8字符串之後的位置。
使用的示例:
int utf32string[] = { 0x448 , 0x65E5 , 0x10346 , 0 };
vector< unsigned char > utf8result;
utf32to8 (utf32string, utf32string + 3 , back_inserter(utf8result));
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
在版本3.0和更高版本中可用。需要C ++ 11兼容的編譯器。
將UTF-32編碼的字符串轉換為UTF-8。
std::string utf32to8 ( const std::u32string& s); s :UTF-32編碼字符串。
返回值:UTF-8編碼字符串。
使用的示例:
u32string utf32string = { 0x448 , 0x65E5 , 0x10346 };
string utf8result = utf32to8(utf32string);
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-32編碼的字符串轉換為UTF-8。
std::u8string utf32to8 ( const std::u32string& s); s :UTF-32編碼字符串。
返回值:UTF-8編碼字符串。
使用的示例:
u32string utf32string = { 0x448 , 0x65E5 , 0x10346 };
u8string utf8result = utf32to8(utf32string);
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-32編碼的字符串轉換為UTF-8。
std::u8string utf32to8 ( const std::u32string_view& s); s :UTF-32編碼字符串。
返回值:UTF-8編碼字符串。
使用的示例:
u32string utf32string = { 0x448 , 0x65E5 , 0x10346 };
u32string_view utf32stringview (utf32string);
u8string utf8result = utf32to8(utf32stringview);
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
在版本3.0和更高版本中可用。需要C ++ 11兼容的編譯器。
將UTF-32編碼的字符串轉換為UTF-8。
std::string utf32to8 ( const std::u32string& s); s :UTF-32編碼字符串。
返回值:UTF-8編碼字符串。
使用的示例:
u32string utf32string = { 0x448 , 0x65E5 , 0x10346 };
string utf8result = utf32to8(utf32string);
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
將UTF-32編碼的字符串轉換為UTF-8。
std::string utf32to8 (std::u32string_view s); s :UTF-32編碼字符串。
返回值:UTF-8編碼字符串。
使用的示例:
u32string utf32string = { 0x448 , 0x65E5 , 0x10346 };
u32string_view utf32stringview (utf32string);
string utf8result = utf32to8(utf32stringview);
assert (utf8result.size() == 9);在無效UTF-32字符串的情況下,拋出了utf8::invalid_code_point 。
可在1.0版和更高版本中提供。
將UTF-8編碼的字符串轉換為UTF-32。
template < typename octet_iterator, typename u32bit_iterator>
u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); octet_iterator :輸入迭代器。
u32bit_iterator :輸出迭代器。
start :指向UTF-8編碼字符串的開頭的迭代器要轉換。
end :迭代器指向傳遞UTF-8編碼字符串的末端進行轉換。
result :輸出迭代器到UTF-32字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-32字符串之後的位置。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
vector< int > utf32result;
utf8to32 (twochars, twochars + 5 , back_inserter(utf32result));
assert (utf32result.size() == 2);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。如果end沒有指向UTF-8序列的過去,則會拋出utf8::not_enough_room Exception。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-32。
std::u32string utf8to32 ( const std::u8string& s); s :UTF-8編碼字符串。返回值:UTF-32編碼字符串。
使用的示例:
const std::u8string* twochars = u8" xe6x97xa5xd1x88 " ;
u32string utf32result = utf8to32(twochars);
assert (utf32result.size() == 2);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
在4.0版和更高版本中可用。需要C ++ 20兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-32。
std::u32string utf8to32 ( const std::u8string_view& s); s :UTF-8編碼字符串。返回值:UTF-32編碼字符串。
使用的示例:
const u8string* twochars = u8" xe6x97xa5xd1x88 " ;
const u8string_view stringview{twochars};
u32string utf32result = utf8to32(stringview);
assert (utf32result.size() == 2);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
在版本3.0和更高版本中可用。需要C ++ 11兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-32。
std::u32string utf8to32 ( const std::string& s); s :UTF-8編碼字符串。返回值:UTF-32編碼字符串。
使用的示例:
const char * twochars = " xe6x97xa5xd1x88 " ;
u32string utf32result = utf8to32(twochars);
assert (utf32result.size() == 2);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
將UTF-8編碼的字符串轉換為UTF-32。
std::u32string utf8to32 (std::string_view s); s :UTF-8編碼字符串。返回值:UTF-32編碼字符串。
使用的示例:
string_view twochars = " xe6x97xa5xd1x88 " ;
u32string utf32result = utf8to32(twochars);
assert (utf32result.size() == 2);如果是無效的UTF-8序列,則會拋出utf8::invalid_utf8異常。
可在1.0版和更高版本中提供。
檢測UTF-8字符串中無效的序列。
template < typename octet_iterator>
octet_iterator find_invalid (octet_iterator start, octet_iterator end); octet_iterator :輸入迭代器。
start :指向UTF-8字符串開始測試有效性的迭代器。
end :指向通過UTF-8字符串的末端的迭代器來測試有效性。
返回值:指向UTF-8字符串中第一個無效八位位的迭代器。如果沒有發現,則等於end 。
使用的示例:
char utf_invalid[] = " xe6x97xa5xd1x88xfa " ;
char * invalid = find_invalid(utf_invalid, utf_invalid + 6 );
assert (invalid == utf_invalid + 5 );此功能通常用於確保UTF-8字符串在使用其他功能處理之前有效。如果在進行任何未選中的操作之前,請尤其重要。
在4.0版和更高版本中可用。
檢測C風格UTF-8字符串中的無效序列。
const char * find_invalid ( const char * str); str :UTF-8編碼字符串。返回值:UTF-8字符串中第一個無效八位位的指針。如果沒有發現,則指向尾部零字節。
使用的示例:
const char * utf_invalid = " xe6x97xa5xd1x88xfa " ;
const char * invalid = find_invalid(utf_invalid);
assert ((invalid - utf_invalid) == 5);此功能通常用於確保UTF-8字符串在使用其他功能處理之前有效。如果在進行任何未選中的操作之前,請尤其重要。
在版本3.0和更高版本中可用。在4.0之前,它需要C ++ 11編譯器;用4.0解除了要求
檢測UTF-8字符串中無效的序列。
std:: size_t find_invalid ( const std::string& s); s :UTF-8編碼字符串。返回值:UTF-8字符串中第一個無效八位位的索引。如果沒有發現,則等於std::string::npos 。
使用的示例:
string utf_invalid = " xe6x97xa5xd1x88xfa " ;
auto invalid = find_invalid(utf_invalid);
assert (invalid == 5 );此功能通常用於確保UTF-8字符串在使用其他功能處理之前有效。如果在進行任何未選中的操作之前,請尤其重要。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
檢測UTF-8字符串中無效的序列。
std:: size_t find_invalid (std::string_view s); s :UTF-8編碼字符串。返回值:UTF-8字符串中第一個無效八位位的索引。如果沒有發現,則等於std::string_view::npos 。
使用的示例:
string_view utf_invalid = " xe6x97xa5xd1x88xfa " ;
auto invalid = find_invalid(utf_invalid);
assert (invalid == 5 );此功能通常用於確保UTF-8字符串在使用其他功能處理之前有效。如果在進行任何未選中的操作之前,請尤其重要。
可在1.0版和更高版本中提供。
檢查一系列八位位置是否是有效的UTF-8字符串。
template < typename octet_iterator>
bool is_valid (octet_iterator start, octet_iterator end); octet_iterator :輸入迭代器。
start :指向UTF-8字符串開始測試有效性的迭代器。
end :指向通過UTF-8字符串的末端的迭代器來測試有效性。
返回值:如果序列是有效的UTF-8字符串, true ; false話。
使用的示例:
char utf_invalid[] = " xe6x97xa5xd1x88xfa " ;
bool bvalid = is_valid(utf_invalid, utf_invalid + 6 );
assert (bvalid == false ); is_valid是find_invalid(start, end) == end; 。您可能需要使用它來確保字節序列是有效的UTF-8字符串,而無需知道如果它不有效,則在哪裡失敗。
在4.0版和更高版本中可用。
檢查C風格的字符串是否包含有效的UTF-8編碼文本。
bool is_valid ( const char * str); str :UTF-8編碼字符串。
返回值: true如果字符串包含有效的UTF-8編碼文本; false話。
使用的示例:
char utf_invalid[] = " xe6x97xa5xd1x88xfa " ;
bool bvalid = is_valid(utf_invalid);
assert (bvalid == false );您可能需要使用is_valid來確保字符串包含有效的UTF-8文本,而無需知道該字符串如果不有效,則在哪裡失敗。
在版本3.0和更高版本中可用。在4.0之前,它需要C ++ 11編譯器;用4.0解除了要求
檢查字符串對像是否包含有效的UTF-8編碼文本。
bool is_valid ( const std::string& s); s :UTF-8編碼字符串。
返回值: true如果字符串包含有效的UTF-8編碼文本; false話。
使用的示例:
char utf_invalid[] = " xe6x97xa5xd1x88xfa " ;
bool bvalid = is_valid(utf_invalid);
assert (bvalid == false );您可能需要使用is_valid來確保字符串包含有效的UTF-8文本,而無需知道該字符串如果不有效,則在哪裡失敗。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
檢查字符串對像是否包含有效的UTF-8編碼文本。
bool is_valid (std::string_view s); s :UTF-8編碼字符串。
返回值: true如果字符串包含有效的UTF-8編碼文本; false話。
使用的示例:
string_view utf_invalid = " xe6x97xa5xd1x88xfa " ;
bool bvalid = is_valid(utf_invalid);
assert (bvalid == false );您可能需要使用is_valid來確保字符串包含有效的UTF-8文本,而無需知道該字符串如果不有效,則在哪裡失敗。
可在2.0版和更高版本中提供。
用替換標記替換字符串中的所有無效UTF-8序列。
template < typename octet_iterator, typename output_iterator>
output_iterator replace_invalid (octet_iterator start, octet_iterator end, output_iterator out, utfchar32_t replacement);
template < typename octet_iterator, typename output_iterator>
output_iterator replace_invalid (octet_iterator start, octet_iterator end, output_iterator out); octet_iterator :輸入迭代器。
output_iterator :輸出迭代器。
start :指向UTF-8字符串開始的迭代器,以尋找無效的UTF-8序列。
end :指向UTF-8字符串端的迭代器,以查找無效的UTF-8序列。
out :輸出迭代器到存儲替換結果的範圍。
replacement :替換標記的Unicode代碼點。沒有此參數的版本假定值0xfffd
返回值:帶有UTF-8字符串之後的迭代器,帶有無效的序列。
使用的示例:
char invalid_sequence[] = " a x80xe0xa0xc0xafxedxa0x80 z " ;
vector< char > replace_invalid_result;
replace_invalid (invalid_sequence, invalid_sequence + sizeof (invalid_sequence), back_inserter(replace_invalid_result), '?');
bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
assert (bvalid);
char * fixed_invalid_sequence = " a????z " ;
assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence)); replace_invalid不會執行無效序列的實地替換。相反,它會產生原始字符串的副本,並用無效的序列替換為替換標記。因此, out在[start, end]範圍內。
在版本3.0和更高版本中可用。在4.0之前,它需要C ++ 11編譯器;用4.0解除了要求
用替換標記替換字符串中的所有無效UTF-8序列。
std::string replace_invalid ( const std::string& s, utfchar32_t replacement);
std::string replace_invalid ( const std::string& s); s :UTF-8編碼字符串。
replacement :替換標記的Unicode代碼點。沒有此參數的版本假定值0xfffd
返回值:帶有無效序列的UTF-8編碼字符串。
使用的示例:
string invalid_sequence = " a x80xe0xa0xc0xafxedxa0x80 z " ;
string replace_invalid_result = replace_invalid(invalid_sequence, ' ? ' );
bvalid = is_valid(replace_invalid_result);
assert (bvalid);
const string fixed_invalid_sequence = " a????z " ;
assert (fixed_invalid_sequence == replace_invalid_result);可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
用替換標記替換字符串中的所有無效UTF-8序列。
std::string replace_invalid (std::string_view s, char32_t replacement);
std::string replace_invalid (std::string_view s); s :UTF-8編碼字符串。
replacement :替換標記的Unicode代碼點。沒有此參數的版本假定值0xfffd
返回值:帶有無效序列的UTF-8編碼字符串。
使用的示例:
string_view invalid_sequence = " a x80xe0xa0xc0xafxedxa0x80 z " ;
string replace_invalid_result = replace_invalid(invalid_sequence, ' ? ' );
bool bvalid = is_valid(replace_invalid_result);
assert (bvalid);
const string fixed_invalid_sequence = " a????z " ;
assert (fixed_invalid_sequence, replace_invalid_result);可在2.3版及以後提供。
檢查八位位序列是否以UTF-8字節訂單標記(BOM)開頭
template < typename octet_iterator>
bool starts_with_bom (octet_iterator it, octet_iterator end); octet_iterator :輸入迭代器。
it :八位位序列開始檢查end :序列的傳遞末端
返回值: true如果序列以UTF-8字節順序標記開頭; false話。
使用的示例:
unsigned char byte_order_mark[] = { 0xef , 0xbb , 0xbf };
bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof (byte_order_mark));
assert (bbom == true );此功能的典型用途是檢查文件的前三個字節。如果它們形成UTF-8 BOM,我們希望在處理實際的UTF-8編碼文本之前跳過它們。
在版本3.0和更高版本中可用。在4.0之前,它需要C ++ 11編譯器;用4.0解除了要求
檢查字符串是否以UTF-8字節訂單標記(BOM)開頭
bool starts_with_bom ( const std::string& s); s :UTF-8編碼字符串。返回值:如果字符串以UTF-8字節訂單標記開頭, true ; false話。
使用的示例:
string byte_order_mark = { char ( 0xef ), char ( 0xbb ), char ( 0xbf )};
bool bbom = starts_with_bom(byte_order_mark);
assert (bbom == true );
string threechars = " xf0x90x8dx86xe6x97xa5xd1x88 " ;
bool no_bbom = starts_with_bom(threechars);
assert (no_bbom == false );此功能的典型用途是檢查文件的前三個字節。如果它們形成UTF-8 BOM,我們希望在處理實際的UTF-8編碼文本之前跳過它們。
可在版本3.2及以後提供。需要C ++ 17兼容的編譯器。
檢查字符串是否以UTF-8字節訂單標記(BOM)開頭
bool starts_with_bom (std::string_view s); s :UTF-8編碼字符串。返回值:如果字符串以UTF-8字節訂單標記開頭, true ; false話。
使用的示例:
string byte_order_mark = { char ( 0xef ), char ( 0xbb ), char ( 0xbf )};
string_view byte_order_mark_view (byte_order_mark);
bool bbom = starts_with_bom(byte_order_mark_view);
assert (bbom);
string_view threechars = " xf0x90x8dx86xe6x97xa5xd1x88 " ;
bool no_bbom = starts_with_bom(threechars);
assert (!no_bbom);此功能的典型用途是檢查文件的前三個字節。如果它們形成UTF-8 BOM,我們希望在處理實際的UTF-8編碼文本之前跳過它們。
可在2.3版及以後提供。
由UTF CPP庫函數拋出的例外基礎類。
class exception : public std :: exception {};使用的示例:
try {
code_that_uses_utf_cpp_library ();
}
catch ( const utf8:: exception & utfcpp_ex) {
cerr << utfcpp_ex. what ();
}可在1.0版和更高版本中提供。
如果UTF-8序列代表和無效的代碼點,則由UTF8 CPP函數( next advance拋出。
class invalid_code_point : public exception {
public:
utfchar32_t code_point () const ;
};成員功能code_point()可用於確定導致異常的無效代碼點。
可在1.0版和更高版本中提供。
如果在解碼過程中檢測到無效的UTF-8序列,則由UTF8 CPP函數(例如next and prior拋出。
class invalid_utf8 : public exception {
public:
utfchar8_t utf8_octet () const ;
};成員函數utf8_octet()可用於確定導致異常的字節序列的開始。
可在1.0版和更高版本中提供。
如果在解碼過程中檢測到無效的UTF-16序列,則由UTF8 CPP函數utf16to8投擲。
class invalid_utf16 : public exception {
public:
utfchar16_t utf16_word () const ;
};成員函數utf16_word()可用於確定導致異常的UTF-16代碼單元。
可在1.0版和更高版本中提供。
如果在解碼代碼點之前達到了解碼的UTF-8序列的末尾,則由UTF8 CPP函數(例如next拋出。
class not_enough_room : public exception {};可在2.0版和更高版本中提供。
將基礎的八位位迭代器改編成迭代代碼點的順序,而不是原始八位位。
template < typename octet_iterator>
class iterator ;iterator();默認構造函數;基礎octet_iterator是用默認構造函數構造的。
explicit iterator (const octet_iterator& octet_it, const octet_iterator& range_start, const octet_iterator& range_end);用octet_it初始化基礎octet_iterator並設置迭代器被認為有效的範圍的構造函數。
octet_iterator base () const;返回基礎octet_iterator。
utfchar32_t operator * () const;解碼UTF-8序列基礎octet_iterator指向並返回代碼點。
bool operator == (const iterator& rhs) const;如果兩個基礎迭代器相等,則返回為true 。
bool operator != (const iterator& rhs) const;如果兩個基礎迭代器不等,則返回為true 。
iterator& operator ++ ();前綴增量 - 將迭代器移至下一個UTF -8編碼的代碼點。
iterator operator ++ (int); Postfix增量 - 將迭代器移至下一個UTF -8編碼的代碼點並返回當前的代碼點。
iterator& operator -- ();前綴減小 - 將迭代器移至先前的UTF -8編碼代碼點。
iterator operator -- (int);後綴減少 - 將迭代器移至先前的UTF -8編碼代碼點並返回當前的代碼點。
使用的示例:
char * threechars = " xf0x90x8dx86xe6x97xa5xd1x88 " ;
utf8::iterator< char *> it (threechars, threechars, threechars + 9 );
utf8::iterator< char *> it2 = it;
assert (it2 == it);
assert (*it == 0x10346 );
assert (*(++it) == 0x65e5);
assert ((*it++) == 0x65e5);
assert (*it == 0x0448 );
assert (it != it2);
utf8::iterator< char *> endit (threechars + 9 , threechars, threechars + 9 );
assert (++it == endit);
assert (*(--it) == 0x0448);
assert ((*it--) == 0x0448);
assert (*it == 0x65e5 );
assert (--it == utf8::iterator< char *>(threechars, threechars, threechars + 9 ));
assert (*it == 0x10346 ); utf8::iterator適配器的目的是啟用簡單的迭代以及使用UTF-8編碼字符串的STL算法。增量和減少運算符是根據utf8::next()和utf8::prior()函數實現的。
請注意, utf8::iterator適配器是檢查的迭代器。它在構造函數中指定的範圍內運行;任何遠離該範圍的嘗試都將導致例外。即使是比較運算符也要求兩個迭代器對像在相同的範圍內構造 - 否則會拋出異常。通常,範圍將由序列容器函數begin和end確定,即:
std::string s = " example " ;
utf8::iterator i (s.begin(), s.begin(), s.end());可在1.0版和更高版本中提供。
將32位代碼點編碼為UTF-8序列序列,並將序列附加到UTF-8字符串上。
template < typename octet_iterator>
octet_iterator append ( utfchar32_t cp, octet_iterator result); cp :一個32位整數,代表代碼點以附加到序列。
result :輸出迭代器到序列中的位置附加代碼點的位置。
返回值:迭代器指向新附加序列之後的位置。
使用的示例:
unsigned char u[ 5 ] = { 0 , 0 , 0 , 0 , 0 };
unsigned char * end = unchecked::append( 0x0448 , u);
assert (u[ 0 ] == 0xd1 && u[ 1 ] == 0x88 && u[ 2 ] == 0 && u[ 3 ] == 0 && u[ 4 ] == 0 );這是utf8::append的更快但更安全的版本。它沒有檢查提供的代碼點的有效性,並且可能會產生無效的UTF-8序列。
在4.0版和更高版本中可用。
編碼一個32位代碼點作為UTF-16單詞序列,並將序列附加到UTF-16字符串上。
template < typename word_iterator>
word_iterator append16 ( utfchar32_t cp, word_iterator result) cp :一個32位整數,代表代碼點以附加到序列。
result :輸出迭代器到序列中的位置附加代碼點的位置。
返回值:迭代器指向新附加序列之後的位置。
使用的示例:
unsigned short u[ 5 ] = { 0 , 0 };
utf8::unchecked::append16 ( 0x0448 , u);
assert (u[ 0 ], 0x0448 );
assert (u[ 1 ], 0x0000 );這是utf8::append的更快但更安全的版本。它沒有檢查提供的代碼點的有效性,並且可能會產生無效的UTF-8序列。
可在1.0版和更高版本中提供。
給定迭代器到UTF-8序列的開頭,它返回代碼點並將迭代器移至下一個位置。
template < typename octet_iterator>
utfchar32_t next (octet_iterator& it); it :指向UTF-8編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向下一個代碼點的開始。
返回值:處理後的UTF-8代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars;
int cp = unchecked::next(w);
assert (cp == 0x65e5 );
assert (w == twochars + 3 );這是utf8::next的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
在4.0版和更高版本中可用。
給定迭代器到UTF-16序列的開頭,它返回代碼點並將迭代器移至下一個位置。
template < typename word_iterator>
utfchar32_t next16 (word_iterator& it); word_iterator :輸入迭代器。
it :指向UTF-16編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向下一個代碼點的開始。
返回值:處理後的UTF-16代碼點的32位表示。
使用的示例:
const unsigned short u[ 3 ] = { 0x65e5 , 0xd800 , 0xdf46 };
const unsigned short * w = u;
int cp = unchecked::next16(w);
assert (cp, 0x65e5 );
assert (w, u + 1 );此功能通常用於通過UTF-16編碼的字符串迭代。
這是utf8::next16的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
可在2.1版和更高版本中提供。
給定迭代器到UTF-8序列的開頭,它返回代碼點。
template < typename octet_iterator>
utfchar32_t peek_next (octet_iterator it); it :指向UTF-8編碼代碼點開始的迭代器。
返回值:處理後的UTF-8代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars;
int cp = unchecked::peek_next(w);
assert (cp == 0x65e5 );
assert (w == twochars);這是utf8::peek_next的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
可在版本1.02和更高版本中提供。
給定對指向UTF-8序列中八位字的迭代器的引用,它降低了迭代器,直到達到了先前的UTF-8編碼代碼點的開始並返回代碼點的32位表示。
template < typename octet_iterator>
utfchar32_t prior (octet_iterator& it); it :指向UTF-8編碼字符串中八位位的引用。函數返回後,將其降低至指向上一個代碼點的開始。
返回值:上一個代碼點的32位表示。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars + 3 ;
int cp = unchecked::prior (w);
assert (cp == 0x65e5 );
assert (w == twochars);這是utf8::prior的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性,也沒有提供邊界檢查。
可在1.0版和更高版本中提供。
通過UTF-8序列中指定數量的代碼點來推進迭代器。
template < typename octet_iterator, typename distance_type>
void advance (octet_iterator& it, distance_type n); it :指向UTF-8編碼代碼點開始的迭代器的引用。函數返回後,它會增加以指向以下代碼點的第n個。 n :代碼點的數量it提高。負值意味著減少。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
char * w = twochars;
unchecked::advance (w, 2 );
assert (w == twochars + 5 );這是utf8::advance的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性,也沒有提供邊界檢查。
可在1.0版和更高版本中提供。
給定迭代器以序列為兩個UTF-8編碼的代碼點,返回它們之間的代碼點的數量。
template < typename octet_iterator>
typename std::iterator_traits<octet_iterator>::difference_type distance (octet_iterator first, octet_iterator last); first :迭代器到UTF-8編碼代碼點的開始。
last :在我們試圖確定長度的序列中,最後一個UTF-8編碼代碼點的“後端”迭代器。它可以是新代碼點的開始。
返回值:迭代器之間的距離,在代碼點中。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
size_t dist = utf8::unchecked::distance(twochars, twochars + 5 );
assert (dist == 2 );這是utf8::distance的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
可在1.0版和更高版本中提供。
將UTF-16編碼的字符串轉換為UTF-8。
template < typename u16bit_iterator, typename octet_iterator>
octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); start :指向UTF-16編碼字符串的開始的迭代器要轉換。
end :指向通過UTF-16編碼字符串的末端的迭代器進行轉換。
result :輸出迭代器到UTF-8字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-8字符串之後的位置。
使用的示例:
unsigned short utf16string[] = { 0x41 , 0x0448 , 0x65e5 , 0xd834 , 0xdd1e };
vector< unsigned char > utf8result;
unchecked::utf16to8 (utf16string, utf16string + 5 , back_inserter(utf8result));
assert (utf8result.size() == 10); 這是utf8::utf16to8的更快但更安全的版本。它沒有檢查提供的UTF-16序列的有效性。
可在1.0版和更高版本中提供。
將UTF-8編碼字符串轉換為UTF-16
template < typename u16bit_iterator, typename octet_iterator>
u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); start :指向UTF-8編碼字符串的開頭的迭代器要轉換。 end :迭代器指向傳遞UTF-8編碼字符串的末端進行轉換。
result :輸出迭代器到UTF-16字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-16字符串之後的位置。
使用的示例:
char utf8_with_surrogates[] = " xe6x97xa5xd1x88xf0x9dx84x9e " ;
vector < unsigned short > utf16result;
unchecked::utf8to16 (utf8_with_surrogates, utf8_with_surrogates + 9 , back_inserter(utf16result));
assert (utf16result.size() == 4);
assert (utf16result[ 2 ] == 0xd834 );
assert (utf16result[ 3 ] == 0xdd1e );這是utf8::utf8to16的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
可在1.0版和更高版本中提供。
將UTF-32編碼的字符串轉換為UTF-8。
template < typename octet_iterator, typename u32bit_iterator>
octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); start :指向UTF-32編碼字符串的開始的迭代器要轉換。
end :指向將UTF-32的字符串傳遞到末端的迭代器要轉換。
result :輸出迭代器到UTF-8字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-8字符串之後的位置。
使用的示例:
int utf32string[] = { 0x448 , 0x65e5 , 0x10346 , 0 };
vector< unsigned char > utf8result;
utf32to8 (utf32string, utf32string + 3 , back_inserter(utf8result));
assert (utf8result.size() == 9);這是utf8::utf32to8的更快但更安全的版本。它沒有檢查提供的UTF-32序列的有效性。
可在1.0版和更高版本中提供。
將UTF-8編碼的字符串轉換為UTF-32。
template < typename octet_iterator, typename u32bit_iterator>
u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); start :指向UTF-8編碼字符串的開頭的迭代器要轉換。
end :迭代器指向傳遞UTF-8編碼字符串的末端進行轉換。
result :輸出迭代器到UTF-32字符串中的位置,以附加轉換結果。
返回值:迭代器指向附加的UTF-32字符串之後的位置。
使用的示例:
char * twochars = " xe6x97xa5xd1x88 " ;
vector< int > utf32result;
unchecked::utf8to32 (twochars, twochars + 5 , back_inserter(utf32result));
assert (utf32result.size() == 2);這是utf8::utf8to32的更快但更安全的版本。它沒有檢查提供的UTF-8序列的有效性。
可在版本3.1和更高版本中提供。
用替換標記替換字符串中的所有無效UTF-8序列。
template < typename octet_iterator, typename output_iterator>
output_iterator replace_invalid (octet_iterator start, octet_iterator end, output_iterator out, utfchar32_t replacement);
template < typename octet_iterator, typename output_iterator>
output_iterator replace_invalid (octet_iterator start, octet_iterator end, output_iterator out); octet_iterator :輸入迭代器。
output_iterator :輸出迭代器。
start :指向UTF-8字符串開始的迭代器,以尋找無效的UTF-8序列。
end :指向UTF-8字符串端的迭代器,以查找無效的UTF-8序列。
out :輸出迭代器到存儲替換結果的範圍。
replacement :替換標記的Unicode代碼點。沒有此參數的版本假定值0xfffd
返回值:帶有UTF-8字符串之後的迭代器,帶有無效的序列。
使用的示例:
char invalid_sequence[] = " a x80xe0xa0xc0xafxedxa0x80 z " ;
vector< char > replace_invalid_result;
unchecked::replace_invalid (invalid_sequence, invalid_sequence + sizeof (invalid_sequence), back_inserter(replace_invalid_result), '?');
bvalid = utf8::is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
assert (bvalid);
char * fixed_invalid_sequence = " a????z " ;
assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence)); replace_invalid不會執行無效序列的實地替換。相反,它會產生原始字符串的副本,並用無效的序列替換為替換標記。因此, out在[start, end]範圍內。
與utf8::replace_invalid不同,此功能無法驗證替換標記的有效性。
可在2.0版和更高版本中提供。
將基礎的八位位迭代器改編成迭代代碼點的順序,而不是原始八位位。
template < typename octet_iterator>
class iterator ;iterator();默認構造函數;基礎octet_iterator是用默認構造函數構造的。
explicit iterator (const octet_iterator& octet_it);一個用octet_it初始化基礎octet_iterator的構造函數。
octet_iterator base () const;返回基礎octet_iterator。
utfchar32_t operator * () const;解碼UTF-8序列基礎octet_iterator指向並返回代碼點。
bool operator == (const iterator& rhs) const;如果兩個基礎迭代器相等,則返回為true 。
bool operator != (const iterator& rhs) const;如果兩個基礎迭代器不等,則返回為true 。
iterator& operator ++ ();前綴增量 - 將迭代器移至下一個UTF -8編碼的代碼點。
iterator operator ++ (int); Postfix增量 - 將迭代器移至下一個UTF -8編碼的代碼點並返回當前的代碼點。
iterator& operator -- ();前綴減小 - 將迭代器移至先前的UTF -8編碼代碼點。
iterator operator -- (int);後綴減少 - 將迭代器移至先前的UTF -8編碼代碼點並返回當前的代碼點。
使用的示例:
char * threechars = " xf0x90x8dx86xe6x97xa5xd1x88 " ;
utf8::unchecked::iterator< char *> un_it (threechars);
utf8::unchecked::iterator< char *> un_it2 = un_it;
assert (un_it2 == un_it);
assert (*un_it == 0x10346 );
assert (*(++un_it) == 0x65e5);
assert ((*un_it++) == 0x65e5);
assert (*un_it == 0x0448 );
assert (un_it != un_it2);
utf8::::unchecked::iterator< char *> un_endit (threechars + 9 );
assert (++un_it == un_endit);
assert (*(--un_it) == 0x0448);
assert ((*un_it--) == 0x0448);
assert (*un_it == 0x65e5 );
assert (--un_it == utf8::unchecked::iterator< char *>(threechars));
assert (*un_it == 0x10346 );這是utf8::iterator的未選中版本。在許多情況下,它更快,但沒有任何有效性或範圍檢查。