J'ai une chaîne _bstr_t
qui contient du texte japonais. Je veux convertir cette chaîne en une chaîne UTF-8 qui est définie comme char *
. Puis-je convertir la chaîne _bstr_t
en chaîne char *
(UTF-8) sans perdre les caractères japonais?_bstr_t à UTF-8 possible?
9
A
Répondre
15
Utiliser WideCharToMultiByte() - Passer CP_UTF8 comme premier paramètre.
Prenez garde que BSTR peut être un pointeur nul et cela correspond à une chaîne vide - traitez cela comme un cas particulier.
-1
Très pratique référence MSDN pour ce genre de chose: http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx
Je pense que vous devez aller à wchar_t * depuis char * perd les choses Unicode, même si je ne suis pas sûr.
// convert_from_bstr_t.cpp
// compile with: /clr /link comsuppw.lib
#include <iostream>
#include <stdlib.h>
#include <string>
#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"
using namespace std;
using namespace System;
int main()
{
_bstr_t orig("Hello, World!");
wcout << orig << " (_bstr_t)" << endl;
// Convert to a char*
const size_t newsize = 100;
char nstring[newsize];
strcpy_s(nstring, (char *)orig);
strcat_s(nstring, " (char *)");
cout << nstring << endl;
// Convert to a wchar_t*
wchar_t wcstring[newsize];
wcscpy_s(wcstring, (wchar_t *)orig);
wcscat_s(wcstring, L" (wchar_t *)");
wcout << wcstring << endl;
// Convert to a CComBSTR
CComBSTR ccombstr((char *)orig);
if (ccombstr.Append(L" (CComBSTR)") == S_OK)
{
CW2A printstr(ccombstr);
cout << printstr << endl;
}
// Convert to a CString
CString cstring((char *)orig);
cstring += " (CString)";
cout << cstring << endl;
// Convert to a basic_string
string basicstring((char *)orig);
basicstring += " (basic_string)";
cout << basicstring << endl;
// Convert to a System::String
String ^systemstring = gcnew String((char *)orig);
systemstring += " (System::String)";
Console::WriteLine("{0}", systemstring);
delete systemstring;
}
1
Voici un code qui devrait faire la conversion.
void PrintUtf8(const TCHAR* value) {
if (value == nullptr) {
printf("");
return;
}
int n = WideCharToMultiByte(CP_UTF8, 0, value, -1, nullptr, 0, nullptr, nullptr);
if (n <= 0) {
printf("");
return;
}
char* buffer = new char[n];
WideCharToMultiByte(CP_UTF8, 0, value, -1, buffer, n, nullptr, nullptr);
printf("%s", buffer);
delete(buffer);
}
Questions connexes
- 1. SQLServer 2005 et UTF8
- 2. SetThreadLocale et UTF8
- 3. PostgreSQL UTF8 Handling
- 4. Convertir latin1 en utf8?
- 5. Comparaison de caractères utf8 PostgreSQL
- 6. (Apache) Possible de faire correspondre les caractères UTF8 aux règles de réécriture?
- 7. affichage incohérent des accents utf8
- 8. MySQL Gem, Ubuntu et UTF8
- 9. Exportation de données UTF8 à partir de db2
- 10. € char est montré comme? en sortie UTF8
- 11. Ruby on Rails: serialize problème UTF8
- 12. Contourner SET NOMS UTF8 pour MySQL
- 13. Problèmes IE7 et UTF8 dans l'ASP classique
- 14. Exemple de chaîne utf8 non valide?
- 15. Delphi 7 Personal, MySQL en utilisant libmysql.dll + UTF8
- 16. Lecture de chaînes UTF8 à partir d'un serveur via http à l'aide de MIDP
- 17. Convertir un codepoint unicode en hexadécimal UTF8 en python
- 18. Postgres encodant l'erreur "UTF8" lors de l'insertion d'images via Java
- 19. Traitement approprié du contenu non-UTF8 dans mon application Rails
- 20. Comment écrire des fichiers avec des caractères UTF8 (lisibles)?
- 21. Encodage d'une chaîne UTF8 en chaîne ISO-8859-1 (VB.NET)
- 22. Pourquoi mes tests Perl échouent-ils avec `use encoding 'utf8'`?
- 23. Vérifiez si un tampon char * contient des caractères UTF8?
- 24. décoder un en-tête de courrier électronique UTF8
- 25. Comment faire passer l'encodage de traitement interne à UTF8 en PHP?
- 26. Comment écrire du texte UTF8 à MySQL depuis ASP.NET via ODBC?
- 27. Passage d'une chaîne UTF8 via java à un service Web .NET
- 28. MYSQL recherche sensible à la casse (en utilisant hibernate) pour utf8
- 29. Possible d'attribuer à plusieurs variables d'un tableau?
- 30. Mod réécriture? slash à sous-domaine possible?
Merci pour votre réponse Nick. Le problème est que je veux envoyer ce contenu _bstr_t via le socket Windows qui permet uniquement d'envoyer le type char * (veuillez vérifier la structure WSABUF dans le fichier ws2def.h). Maintenant, un wont ne le fera pas. Existe-t-il une version de char large de la structure _WSABUF? –
Windows Sockets ne se soucie pas des données que vous envoyez. Dans ce cas, vous pouvez juste réinterpréter_cast en char * et être bien. – sharptooth
Juste ne pas gâcher avec le nombre d'octets - c'est le nombre de caractères Unicode fois sizeof (WCHAR) - et avec null BSTRs. – sharptooth