Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi AnsiStringT模板中的变量 我目前使用的转换函数看起来像C++ +Builder: UnicodeString OutputInCodePageconst int CodePage,std::string&InStr,const unsigned Offs { 开关码页 { 违约: 案例0:返回AnsiStringT InStr.substrofs.c_str;//系统默认值 案例037:返回AnsiStringT InStr.substrofs.c_str;//IBM037 IBM EBCDIC US Canada 案例437:返回AnsiStringT InStr.substrofs.c_str;//IBM437 OEM美国 案例500:return AnsiStringT InStr.substrofs.c_str;//IBM500 IBM EBCDIC International //还有更多的人。。。 } }_Delphi_Switch Statement_C++builder_Codepages - Fatal编程技术网

Delphi AnsiStringT模板中的变量 我目前使用的转换函数看起来像C++ +Builder: UnicodeString OutputInCodePageconst int CodePage,std::string&InStr,const unsigned Offs { 开关码页 { 违约: 案例0:返回AnsiStringT InStr.substrofs.c_str;//系统默认值 案例037:返回AnsiStringT InStr.substrofs.c_str;//IBM037 IBM EBCDIC US Canada 案例437:返回AnsiStringT InStr.substrofs.c_str;//IBM437 OEM美国 案例500:return AnsiStringT InStr.substrofs.c_str;//IBM500 IBM EBCDIC International //还有更多的人。。。 } }

Delphi AnsiStringT模板中的变量 我目前使用的转换函数看起来像C++ +Builder: UnicodeString OutputInCodePageconst int CodePage,std::string&InStr,const unsigned Offs { 开关码页 { 违约: 案例0:返回AnsiStringT InStr.substrofs.c_str;//系统默认值 案例037:返回AnsiStringT InStr.substrofs.c_str;//IBM037 IBM EBCDIC US Canada 案例437:返回AnsiStringT InStr.substrofs.c_str;//IBM437 OEM美国 案例500:return AnsiStringT InStr.substrofs.c_str;//IBM500 IBM EBCDIC International //还有更多的人。。。 } },delphi,switch-statement,c++builder,codepages,Delphi,Switch Statement,C++builder,Codepages,但我真的想避免使用大型开关/机箱-类似这样的: UnicodeString OutputInCodePageconst int CodePage,std::string&InStr,const unsigned Offs { 返回AnsiStringT InStr.substrofs.c_str; } 这不起作用,给我E2396模板参数必须是常量表达式错误 有没有一种方法可以重新编写代码,这样我就可以使用std::string原始数据转换为基于代码页参数的UnicodeString,而无需庞大的

但我真的想避免使用大型开关/机箱-类似这样的:

UnicodeString OutputInCodePageconst int CodePage,std::string&InStr,const unsigned Offs { 返回AnsiStringT InStr.substrofs.c_str; } 这不起作用,给我E2396模板参数必须是常量表达式错误


有没有一种方法可以重新编写代码,这样我就可以使用std::string原始数据转换为基于代码页参数的UnicodeString,而无需庞大的开关/案例列表?

确实有一种更简单的方法来处理此问题-使用类型和函数,例如:

UnicodeString OutputInCodePageconst int CodePage,const std::string&InStr,const unsigned Offs { RawByteString OUTISTR.c_str+OFF; SetCodePageout,CodePage,false; 返回; } 或者,使用以下功能:

UnicodeString OutputInCodePageconst int CodePage,const std::string&InStr,const unsigned Offs { 破坏; const char*p_in=InStr.c_str+Offs; int in_len=仪表长度-关断; int out_len=unicodedefromlocalecharscodepage,0,p_in,in_len,NULL,0; 如果out\u len>0 { out.SetLengthout_len; UnicodeFromLocaleCharsCodePage,0,p_-in,in_-len,out.c_-str,out_-len; } 返回; }
谢谢你的回复!请注意,“UnicodeFromLocaleChars”在非Windows平台上可能非常慢,因为需要在这些平台上提供区域名称。我开发了一个完美的散列,它可以非常快地转换这个值。散列只是一个%和一个异或,IIRC。我来看看。它的速度大约是System.pas中POSIX版本的10倍,在某些代码中,这确实会产生影响。