2015-01-08 7 views
-1

Есть ли тип AnsiString(65001) в C++, как есть в Delphi? Я хотел бы использовать его для взаимодействия между приложением и DLL.AnsiString в C++?

+1

Я предполагаю, что означает строку Узкие-символов в кодировке Windows 65001, которая является плохо поддерживаемой кодовой страницей UTF-8. Просто используйте 'std :: string' и помните, что это UTF-8. – Deduplicator

+0

@Deduplicator Вы уверены? http://pastebin.com/siaV0ytN –

+0

@JohnLewis не уверен, что вы просите, но ваш фрагмент работает отлично: http://ideone.com/d5ZAwC – tux3

ответ

1

В C++ Builder конкретно (который использует тот же RTL как Delphi), есть AnsiStringT шаблонный класс, который обеспечивает ту же функциональность как AnsiString(N) типа в Delphi:

template <unsigned short CP> 
class RTL_DELPHIRETURN AnsiStringT : public AnsiStringBase 

Где CP является желаемой кодовой страницы.

В РТЛ в UTF8String и RawByteString типы просто псевдонимы для этой функции:

Delphi:

type 
    UTF8String = type AnsiString(65001); 
    RawByteString = type AnsiString($ffff); 

C++ Builder:

typedef AnsiStringT<65001> UTF8String; 
typedef AnsiStringT<65535> RawByteString; 
+0

И 'Visual C++'? –

+0

В других компиляторах C++ такой эквивалентной функциональности нет. Вы должны использовать явные преобразования в своем коде через 'MultiByteToWideChar()'/'WideCharToMultiByte()', 'std :: codecvt' и т. Д. (Которые вы могли бы использовать для написания собственного класса обертки типа AnsiStringT, если это необходимо). –

+0

Мне нужно будет перенести «AnsiString» на «Visual C++», затем :) –

4

std::string гарантированно выступать в качестве контейнера char с, а char гарантированно будет ровно 1 байт, который, кажется, соответствует описанию в AnsiString.

Обратите внимание, что вы всегда можете заставить несколько многобайтовых символов Юникода в std :: string, если вы действительно этого хотите, нет никакой принудительной гарантии, чтобы каждый логический символ был закодирован 1 байт. Нет простого способа обеспечить выполнение этого в C++, не написав собственный класс.

Для взаимодействия, вы можете использовать raw cstring (char*).

Смежные вопросы