2016-08-29 3 views
-5

Benötigen Sie implementieren Encoding.Unicode.GetBytes in nativen C++.Alternative Methode Encoding.Unicode.GetBytes in systemeigenem C++

.NET Umsetzung:

Console.WriteLine("codePage number: " + Encoding.Unicode.CodePage.ToString()); 
Console.Write("string: "); 
foreach (var ch in Encoding.Unicode.GetBytes("string")) 
    Console.Write(ch.ToString("X") + "-"); 
Console.WriteLine(); 
Console.Write("строка: "); 
foreach (var ch in Encoding.Unicode.GetBytes("строка")) 
    Console.Write(ch.ToString("X") + "-"); 
Console.ReadLine(); 

.NET Implementierung Ausgabe:

codePage number: 1200 
string: 73-0-74-0-72-0-69-0-6E-0-67-0 
строка: 41-4-42-4-40-4-3E-4-3A-4-30-4 

Wie diese Methode implementieren (ohne Verwendung Boost, QT, etc ..) zu C++?


fand ich diese Methode von Windows:

#include <exception> 
#include <iostream> 
#include <ostream> 
#include <string> 
#include <Windows.h> 

std::wstring ConvertToUTF16(const std::string & source, const UINT codePage) 
{ 
    // Fail if an invalid input character is encountered 
    static const DWORD conversionFlags = MB_ERR_INVALID_CHARS; 

    // Require size for destination string 
    int utf16Length = ::MultiByteToWideChar(
     codePage,   // code page for the conversion 
     conversionFlags, // flags 
     source.c_str(),  // source string 
     source.length(), // length (in chars) of source string 
     NULL,    // unused - no conversion done in this step 
     0     // request size of destination buffer, in wchar_t's 
    ); 
    if (utf16Length == 0) 
    { 
     const DWORD error = ::GetLastError(); 
     throw std::exception(
      "MultiByteToWideChar() failed: Can't get length of destination UTF-16 string.", 
      error); 
    } 

    // Allocate room for destination string 
    std::wstring utf16Text; 
    utf16Text.resize(utf16Length); 

    // Convert to Unicode 
    if (!::MultiByteToWideChar(
     codePage,   // code page for conversion 
     0,     // validation was done in previous call 
     source.c_str(),  // source string 
     source.length(), // length (in chars) of source string 
     &utf16Text[0],  // destination buffer 
     utf16Text.length() // size of destination buffer, in wchar_t's 
    )) 
    { 
     const DWORD error = ::GetLastError(); 
     throw std::exception(
      "MultiByteToWideChar() failed: Can't convert to UTF-16 string.", 
      error); 
    } 

    return utf16Text; 
} 

void main() 
{ 
    try 
    { 
     // ASCII text 
     std::string inText("string"); 

     // Unicode 
     static const UINT codePage = 1200; 

     // Convert to Unicode 
     const std::wstring utf16Text = ConvertToUTF16(inText, codePage); 

     // Show result 
     for (size_t i = 0; i < utf16Text.size(); i++) 
      printf("%X-", utf16Text[i]); 
    } 
    catch (const std::exception& e) 
    { 
     std::cerr << "*** ERROR:\n"; 
     std::cerr << e.what(); 
     std::cerr << std::endl; 
    } 

    getchar(); 
} 

aber MultiByteToWideChar keine Rückkehr Stringgröße für 1200 Codepage (Unicode).

+2

Stack Overflow ist kein Codeübersetzungsdienst. –

+1

@ NicolBolas, ich lese über Themen, Antworten - mir nicht helfen. – Align

+0

Ich habe viele verschiedene Methoden ausprobiert, ich kann die Entwicklungen bei Bedarf zeigen. – Align

Antwort

1

Die Codepage-Parameter von MultiByteToWideChar() gibt die Codierung des Eingangs char Daten so kann es FROM umgewandelt werden, die TO UTF-16-Codierung. Sie verwenden Codepage 1200 nie in Win32-Programmierung.

Strings in .NET sind in UTF-16 codiert. Encoding.Unicode.GetBytes() gibt ein UTF-16LE-codiertes Byte-Array zurück. Daher werden die Zeichendaten unverändert als Bytes zurückgegeben.

Für UTF-16 auf Windows verwenden wchar_t oder char16_t basierte Strings (wie std::wstring oder std::u16string). Wenn Sie einen UTF-16 codierten Byte-Array benötigen, weisen 2 * length Bytes (wie mit einem std::vector) und kopieren Sie die rohen Zeichenfolge Zeichen, wie sie ist:

std::vector<BYTE> GetUnicodeBytes(const std::wstring &str) 
{ 
    std::vector<BYTE> result; 
    if (!str.empty()) 
    { 
     result.resize(sizeof(wchar_t) * str.length()); 
     CopyMemory(&result[0], str.c_str(), result.size()); 
    } 
    return result; 
} 

std::wcout << L"string: "; 
for (auto ch: GetUnicodeBytes(L"string")) 
    std::wcout << std::hex << (int)ch << L"-"; 
std::wcout << std::endl; 
std::wcout << L"строка: "; 
for (auto ch: GetUnicodeBytes(L"строка")) 
    std::wcout << std::hex << (int)ch << L"-"; 
std::wcout << std::endl; 

Alternativ:

std::vector<BYTE> GetUnicodeBytes(const std::u16string &str) 
{ 
    std::vector<BYTE> result; 
    if (!str.empty()) 
    { 
     result.resize(sizeof(char16_t) * str.length()); 
     CopyMemory(&result[0], str.c_str(), result.size()); 
    } 
    return result; 
} 

std::wcout << L"string: "; 
for (auto ch: GetUnicodeBytes(u"string")) 
    std::wcout << std::hex << (int)ch << L"-"; 
std::wcout << std::endl; 
std::wcout << L"строка: "; 
for (auto ch: GetUnicodeBytes(u"строка")) 
    std::wcout << std::hex << (int)ch << L"-"; 
std::wcout << std::endl; 
+0

Danke. Du bist ein guter Mensch. – Align

Verwandte Themen