我正在维护一个遗留的oracle proc C/C++
代码,该代码正在处理文本文件并更新数据库。在代码中,他们正在准备一个看起来像这样的SELECT
语句
SELECT 'ERROR_ID=§' || ERROR_ID || '§' || ' AND ' ...
在执行 select 语句后,他们将在 char 数组中获取如下所示的数据。
ERROR_ID=§ASI:10§ AND
稍后他们将部分符号(§)替换为单引号,如下所示
if((char)file_str.arr[k]=='§')
{
strncpy((char*)&file_str.arr[k],"'",1);
}
基本上,他们从数据库(旧主键)中获取主键,并比较文本文件中存在的主键(新键)。 他们使用简单的strcmp
来比较这些主键。
现在我遇到了一个问题。即使新旧主键匹配,如果我查看日志文件,这些问号而不是单引号。
ERROR_ID=?ASI:10? AND FORM_ID=?064956? - old key
ERROR_ID='ASI:10' AND FORM_ID='064956' - new key
我猜,因为他们正在使用代码中的sectional symbol(§)
,这是一个non ASCII char
,它失败了。
请指教。
更新:相同的二进制文件部署在不同的环境中。在某些环境中,分段符号(§)被替换为"?"标记,而在某些环境中它工作正常。 问题: 是否有任何环境设置正在影响这一点?如果是,我应该寻找什么。
所有环境中的操作系统是:SunOS 5.10
您的可执行文件可能没有设置任何区域设置。因此,您的程序使用环境设置的区域设置运行。我建议从代码内部设置语言环境,例如:setlocale(LC_ALL,"C"); 在其他任何事情运行之前。
我认为这种方法不正确。我认为你应该
- 阅读文本文件,转换为wchar_t确保文本文件的区域设置正确。无论是固定宽度字符集(以字节为单位的代码页,UCS-2),多字节字符集(UTF-8,其他),您最终都会得到wchar_t中的固定宽度字符集。
- 将 SQL 构造为 wstring。现在,无论输入文件如何,"§"都应该正确。
- 执行 SQL。