在VC++ 2003中,我可以将源文件保存为UTF-8,并且所有字符串都按原样使用.换句话说,以下代码将按字符串打印到控制台.如果源文件保存为UTF-8,则输出将为UTF-8.
printf("Chinese (Traditional)");
printf("??? (??)");
printf("??? (??)");
printf("Chinês (Tradicional)");
Run Code Online (Sandbox Code Playgroud)
我已经使用UTF-8 BOM保存了UTF-8格式的文件.但是使用VC2008进行编译会导致:
warning C4566: character represented by universal-character-name '\uC911'
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D'
cannot be represented in the current code page (932)
etc.
Run Code Online (Sandbox Code Playgroud)
导致这些警告的字符已损坏.适合语言环境的语言(在本例中为932 =日语)将转换为语言环境编码,即Shift-JIS.
我找不到让VC++ 2008为我编译的方法.请注意,我在源文件中使用的区域设置无关紧要.似乎没有一个语言环境说"我知道我在做什么,所以不要f $%## ng更改我的字符串文字".特别是,无用的UTF-8伪语言环境不起作用.
#pragma setlocale(".65001")
=> error C2175: '.65001' : invalid locale
Run Code Online (Sandbox Code Playgroud)
"C"也不是:
#pragma setlocale("C")
=> see warnings above (in particular locale is still 932)
Run Code Online (Sandbox Code Playgroud)
似乎VC2008强制所有字符进入指定的(或默认)语言环境,并且该语言环境不能是UTF-8.我不想更改文件以使用转义字符串,如"\ xbf\x11 ...",因为相同的源代码是使用gcc编译的,可以很好地处理UTF-8文件.
有没有办法指定源文件的编译应该保持字符串文字不变?
换句话说,在编译源文件时,我可以使用哪些编译标志来指定与VC2003的向后兼容性.即不要改变字符串文字,按字节顺序使用它们.
更新
感谢您的建议,但我想避免使用wchar.由于这个应用程序专门处理UTF-8中的字符串,因此使用wchar会要求我将所有字符串转换回UTF-8,这应该是不必要的.所有输入,输出和内部处理均采用UTF-8格式.这是一个简单的应用程序,在Linux和使用VC2003编译时工作正常.我希望能够使用VC2008编译相同的应用程序并使其工作. …
是否可以从makefile更新环境?我希望能够创建一个目标来为它们设置客户端环境变量.像这样的东西:
AXIS2_HOME ?= /usr/local/axis2-1.4.1
JAVA_HOME ?= /usr/java/latest
CLASSPATH := foo foo
setenv:
export AXIS2_HOME
export JAVA_HOME
export CLASSPATH
Run Code Online (Sandbox Code Playgroud)
这样客户就可以做到:
make setenv all
java MainClass
Run Code Online (Sandbox Code Playgroud)
并且让它工作而不需要为java执行本身设置类路径.
或者我是否希望以错误的方式做到这一点并且有更好的方法?
在3.0.5之前,BeautifulSoup曾经将<textarea>的内容视为HTML。它现在将其视为文本。我正在解析的文档的 textarea 标记内有 HTML,我正在尝试处理它。
我试过了:
for textarea in soup.findAll('textarea'):
contents = BeautifulSoup.BeautifulSoup(textarea.contents)
textarea.replaceWith(contents.html(text=True))
Run Code Online (Sandbox Code Playgroud)
但我收到错误。我在文档中找不到这个,并且替代解析器没有帮助。有人知道我如何将文本区域解析为 HTML 吗?
编辑:
HTML 示例为:
<textarea class="ks-lazyload-custom">
<div class="product-view product-view-rug">
Foobar Womble
<div class="product-view-head">
<img src="tps/i1/fo-25.gif" />
</div>
</div>
</textarea>
Run Code Online (Sandbox Code Playgroud)
错误是:
File "D:\src\cross\tserver\src\tools\sitecrawl\BeautifulSoup.py", line 1913,
in _detectEncoding '^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
TypeError: expected string or buffer
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种获取元素、提取内容、使用 BeautifulSoup 解析它们、将其折叠为文本,然后用该文本替换原始元素的内容(或替换整个元素)的方法。
至于现实世界与规范,实际上在这里并不是特别相关。需要解析数据,我正在寻找这样做的方法。
我在 Oracle 10g 上使用 ODBC 3.0 插入到表中,但失败了,我不知道为什么。数据库在 Windows Server 2003 上。客户端在 Windows XP 上。
桌子:
CREATE TABLE test ( testcol NUMBER(20,0) NULL );
Run Code Online (Sandbox Code Playgroud)
ODBC 调用:
SQLAllocHandle(SQL_HANDLE_STMT) = SQL_SUCCESS
SQLPrepare(INSERT INTO test (testcol) VALUES (?);) = SQL_SUCCESS
SQLINTEGER nStrLen = 0;
__int64 nInt64 = 99;
SQLBindParameter(hStatement, 1, SQL_PARAM_INPUT,
SQL_C_SBIGINT, SQL_BIGINT, 20, 0, &nInt64, 0, &nStrLen) = SQL_SUCCESS
SQLExecute() = SQL_ERROR
SQLGetDiagRec(1) = SQL_NO_DATA
Run Code Online (Sandbox Code Playgroud)
SQLBindParameter成功但随后SQLExecute失败。没有诊断消息。
我不得不求助于将 int64 写入字符串并将其绑定为字符串。这是绑定 int64 的唯一方法吗?
使用ICU 4.0正则表达式库,我发现以下正则表达式呈现指数时间:
actual: "[^<]*<\?"
C code: "[^<]*<\\?"
Run Code Online (Sandbox Code Playgroud)
目的:找到"<?" 在它之前没有其他"<"
在纯文本上运行此正则表达式时,根本没有"<"字符,它似乎需要指数时间.如果文本至少有一个"<",那么它很快.我不明白为什么.
不应该在"<?"上匹配 防止这需要回溯?我本以为它会尝试找到第一个"<",然后测试表达式的其余部分.如果找不到"<"则会放弃,因为模式显然无法匹配.
这是ICU正则表达式中的错误还是预期的?
我想传递字符串"!changeme!" 在命令行上的java程序,如:
java -cp "!AXIS2_CLASS_PATH!" ClientJava --userid admin --passwd "!changeme!"
Run Code Online (Sandbox Code Playgroud)
使用Windows XP,Java jdk 1.6.0_07.
AXIS2_CLASS_PATH正常替换,我假设是java运行时.但密码是!changeme!似乎也被替换为空字符串.我假设这个替换是某种JVM功能.
使用以下程序:
static int Run(String[] aArgs) {
for (String s: aArgs) {
System.out.println("arg: " + s);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
"C:\Program Files\Java\jdk1.6.0_07\bin\java" -cp "!AXIS2_CLASS_PATH!"
ClientJava --userid admin --passwd "!changeme!"
arg: --userid
arg: admin
arg: --passwd
arg:
Run Code Online (Sandbox Code Playgroud)
我需要密码才能通过.我尝试了各种各样的逃避,但我还没有找到我需要使用的东西.
任何人都可以提供如何做到这一点的提示吗?
Zach Scrivena提供的解决方案是:
使用插入符号来逃避感叹号.
java -cp "!AXIS2_CLASS_PATH!" ClientJava --xxx "^!changeme^!"
arg: --userid
arg: admin
arg: --passwd
arg: !changeme!
Run Code Online (Sandbox Code Playgroud) c++ ×1
command-line ×1
fedora ×1
html-parsing ×1
java ×1
linux ×1
makefile ×1
odbc ×1
oracle ×1
oracle10g ×1
python ×1
regex ×1
unicode ×1
utf-8 ×1
visual-c++ ×1