我的Win32 Delphi应用程序分析由不支持Unicode的其他应用程序生成的文本文件.因此,我的应用程序需要读取和写入ansi字符串,但我想通过在GUI中使用Unicode来提供更好的本地化用户体验.该应用程序对来自TList的对象中的字符串进行了一些非常重要的逐字符分析.
在从Delphi 2006到Delphi 2009的过渡到Unicode GUI时,我是否应该计划:
我意识到真正详细的响应需要大量的代码 - 我只是询问那些进行过这种转换并仍然需要使用纯文本文件的人的印象.在ansistrings和Unicode之间放置屏障的位置?
编辑:如果#1,为ansistring输出映射Unicode字符串的任何建议?我猜想输入字符串的转换将使用tstringlist.loadfromfile自动转换(例如).
是否有一个方便的Format()函数只适用于Ansi字符串?因为每次我使用带有Format()的AnsiString时都会收到警告.不,我不希望Delphi在Wide和Ansi字符串之间来回转换我的AnsiStrings.这只是让事情变得非常慢.另外,有没有办法强制字符串常量为Ansi?看一下这个
function SomeStrFunc(S: AnsiString): AnsiString; overload;
function SomeStrFunc(S: String): String; overload;
Run Code Online (Sandbox Code Playgroud)
然后当我使用SomeStrFunc('ABC')时,它将调用宽字符串版本.如果我想使用Ansi版本并强制Delphi在AnsiChars中存储'ABC'常量怎么办?
我有一个用D2007编译的DLL,它具有返回AnsiStrings的函数.
我的申请是在D2009编制的.当它调用AnsiString函数时,它会返回垃圾.
我创建了一个小测试app/dll进行实验,发现如果app和dll都使用相同版本的Delphi(2007或2009)进行编译,则没有问题.但是当一个在2009年和另一个2007年编译时,我得到了垃圾.
我已经尝试在这两个项目中包含最新版本的FastMM,但即使这样,2009应用程序也无法从2007 dll中读取AnsiStrings.
这里出了什么问题的想法?有办法解决这个问题吗?
我创建了以下代码:
Function AnsiStringToStream(Const AString: AnsiString): TStream;
Begin
Result := TStringStream.Create(AString, TEncoding.ANSI);
End;
Run Code Online (Sandbox Code Playgroud)
但我是"W1057从'AnsiString'到'string'的隐式字符串转换"
他有什么问题吗?
谢谢.
IntToStr()
函数返回现在是Unicode的字符串.我想转换为AnsiString
.我可以AnsiString(IntToStr(I))
安全使用吗?
exzample code:
var
str1 : String;
str2 : AnsiString;
....
str2 := ....;
str1 := String(str2);
Run Code Online (Sandbox Code Playgroud)
我按照上面的方法进行了转换,但没有成功。我发现 str1 中丢失了一些数据。是否有安全的方法将 AnsiString 转换为 UnicodeString?
我继承了一个旧的Borland C++ Builder应用程序,现在我必须迁移到一个新的开发工具.建议的方法是使用Embarcadero C++ Builder,从我最初的测试看,它似乎是一个相当平滑的过渡.
但我有一个问题,我希望有一个简单的解决方案:
该应用程序解析大量的文本文件.这些文件都是基于ANSI的,并且永远不会改变,因此它是ANSI输入和ANSI输出.我string
遇到的主要问题是,使用Embarcadero C++,类型现在是一个UnicodeString
而不是AnsiString
(就像在Borland C++ Builder中一样).
在此应用程序中使用Unicode不是一个选项 - 它使用的文件是ANSI格式的.修改要使用的代码AnsiString
(和类似的代码)是可行的,但我不愿意,因为它使用了很多TStringList
(和类似的)构造.
所以我的问题是:是否有一个设置或编译器选项或者我可以用来告诉Embarcadero System.AnsiString
用作定义string
而不是System.UnicodeString
?
这可能是一个长镜头,但是RAD Studio XE(我借用它来做一些测试的旧版本)文档说" 默认情况下,类型string
现在是一个Unicode字符串",这意味着这可以是改变.然而,这在当前版本(XE8)的文档中被重新描述,所以......
我有一个关于我必须将UTF8字符串转换为ANSI字符串的代码的问题.我的代码适用于元音中的重音,但是用字母Ñ它不起作用.代码打破了字符串.我该如何解决这个错误?
我在UTF8中
的字符串:EDIFICIOPEÃ'ASBLANCAS如果正确,我将在ANSI中使用
的字符串:EDIFICIOPEÑASBLANCAS 我现在使用ANSI的字符串:EDIFICIO PE
代码在这里:
function TFormMain.convertir_utf8_ansi(const Source: string):string;
var
Iterator, SourceLength, FChar, NChar: Integer;
begin
Result := '';
Iterator := 0;
SourceLength := Length(Source);
while Iterator < SourceLength do
begin
Inc(Iterator);
FChar := Ord(Source[Iterator]);
if FChar >= $80 then
begin
Inc(Iterator);
if Iterator > SourceLength then break;
FChar := FChar and $3F;
if (FChar and $20) <> 0 then
begin
FChar := FChar and $1F;
NChar := Ord(Source[Iterator]);
if (NChar and $C0) <> $80 then break;
FChar …
Run Code Online (Sandbox Code Playgroud) 我有一个AnsiString
,我需要以最有效的方式将它转换为TBytes
. 我怎样才能做到这一点 ?
在Delphi XE中,我使用的是BASS音频库,它包含以下功能:
function BASS_StreamCreateURL(url: PAnsiChar; offset: DWORD; flags: DWORD;
proc: DOWNLOADPROC; user: Pointer):HSTREAM; stdcall; external bassdll;
Run Code Online (Sandbox Code Playgroud)
'url'参数的类型为PAnsiChar,所以在我的代码中我做了一个强制转换:
FStreamHandle := BASS_StreamCreateURL(PAnsiChar( url ) [...]
Run Code Online (Sandbox Code Playgroud)
编译器在此行上发出警告:"对PAnsiChar的字符串的可疑类型转换".在试图消除警告时,我发现推荐的方法是使用双重投射:
FStreamHandle := BASS_StreamCreateURL(PAnsiChar( AnsiString( url )) [...]
Run Code Online (Sandbox Code Playgroud)
这确实消除了警告,但是BASS函数现在返回错误代码2("无法打开文件"),这告诉我它收到的URL字符串以某种方式被破坏.我无法看到低音DLL实际接收到的内容,但在调试器中使用断点时字符串看起来很好:
var
s : PAnsiChar;
begin
s := PAnsiChar( AnsiString( url ));
Run Code Online (Sandbox Code Playgroud)
此时字符串s显示正常,但是当我通过它时BASS功能失败.我的初始代码:PAnsiChar(url)与BASS配合良好,但会发出警告.
那么在没有警告的情况下从UnicodeString到PAnsiChar的正确方法是什么?
ansistring ×10
delphi ×9
delphi-2009 ×3
delphi-xe2 ×2
string ×2
c++ ×1
c++builder ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe4 ×1
dll ×1
integer ×1
pointers ×1
stream ×1
unicode ×1
utf-8 ×1
widestring ×1