簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM