![](/img/trans.png)
[英]string size after converting const unsigned char[] to std::string
[英]const unsigned char * to std::string
sqlite3_column_text返回一個const unsigned char *,如何將其轉換為std :: string? 我試過std :: string(),但是我收到了一個錯誤。
碼:
temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));
錯誤:
1>.\storage_manager.cpp(109) : error C2440: '<function-style-cast>' : cannot convert from 'const unsigned char *' to 'std::string'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
你可以嘗試:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
雖然std::string
可以有一個構造函數,它接受const unsigned char*
,但顯然它沒有。
那為什么不呢? 你可以看看這個有點相關的問題: 為什么C ++流使用char而不是unsigned char?
在實際上,您實際上需要一串無符號字符,您可以創建自己的類型:
typedef std::basic_string <unsigned char> ustring;
那么你應該可以這樣說:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
人們通常使用(unsigned char *)類型的原因是為了表明數據是二進制而不是純ASCII文本。 我知道libxml會這樣做,從它的外觀來看,sqlite正在做同樣的事情。
您從sqlite調用中獲取的數據可能是UTF-8編碼的Unicode文本。 雖然reinterpret_cast似乎可以正常工作,但如果有人在非純ASCII字段中存儲文本,那么您的程序可能不會表現良好。
std :: string類在設計時沒有考慮到Unicode,所以如果你要求字符串的length(),你將獲得字節數,在UTF-8中,它不一定是同一個東西作為字符數。
簡短的回答:如果您確定數據只是ASCII,那么簡單的強制轉換可能會起作用。 如果它可以是任何UTF-8數據,那么您需要以更智能的方式處理編碼/解碼。
我不熟悉sqlite3_column_text,但你可能想要做的一件事是當你調用std:string構造函數時,你想要轉換為(const char *)。 我相信它應該有一個這種類型的構造函數。
但是,很奇怪這個sqlite函數返回一個unsigned char *,它是否返回一個Pascal字符串(第一個char是字符串的長度)? 如果是這樣,那么你將不得不用字節和長度創建std :: string。
嘗試:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
我不是專家,但這個例子似乎更簡單:
string name = (const char*) (sqlite3_column_text(res, 0));
你不能從c onst unsigned char*
構造一個std::string
- 你必須先將它onst unsigned char*
轉換為const char*
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
如果temp_doc.uuid是std :: string,請嘗試:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
如果您必須保留unsigned char序列中的完整信息,這是一個古老但重要的問題。 在我看來,與reinterpret_cast不同的是。 我發現了一個有趣的解決方案, 將字符串轉換為我修改為的向量
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
string firstItem( temp.begin(), temp.end() );
由於我正在為gtkmm編程,你可以實現轉換為Glib :: ustring
basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.