小编bro*_*eld的帖子

如何在Visual C++ 2008中创建UTF-8字符串文字

在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编译相同的应用程序并使其工作. …

c++ utf-8 visual-c++

62
推荐指数
6
解决办法
5万
查看次数

unicode.org文件"UnicodeData.txt"的字段记录在哪里?

我找不到UnicodeData.txt文件的实际字段的文档.

数据可在此处获得.描述它的文档在这里可用,但它没有列出实际的字段编号和字段是什么(就像在3.0版本的文档中一样).

我搜索过这个网站,一定是错过了我眼前的东西,但我找不到它.

有人可以指出这些信息现在在哪里吗?

unicode

14
推荐指数
1
解决办法
2860
查看次数

makefile可以更新调用环境吗?

是否可以从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执行本身设置类路径.

或者我是否希望以错误的方式做到这一点并且有更好的方法?

linux makefile fedora

5
推荐指数
1
解决办法
7012
查看次数

如何让 BeautifulSoup 将 textarea 标签的内容解析为 HTML?

在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 解析它们、将其折叠为文本,然后用该文本替换原始元素的内容(或替换整个元素)的方法。

至于现实世界与规范,实际上在这里并不是特别相关。需要解析数据,我正在寻找这样做的方法。

python beautifulsoup html-parsing

5
推荐指数
1
解决办法
6052
查看次数

将 int64 (SQL_BIGINT) 绑定为查询参数会导致在 Oracle 10g ODBC 中执行期间出错

我在 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 的唯一方法吗?

oracle odbc oracle10g

4
推荐指数
1
解决办法
3312
查看次数

为什么正则表达式"[^ <]*<\\?" 展示文本没有"<"时的指数时间?

使用ICU 4.0正则表达式库,我发现以下正则表达式呈现指数时间:

actual: "[^<]*<\?"
C code: "[^<]*<\\?"
Run Code Online (Sandbox Code Playgroud)

目的:找到"<?" 在它之前没有其他"<"

在纯文本上运行此正则表达式时,根本没有"<"字符,它似乎需要指数时间.如果文本至少有一个"<",那么它很快.我不明白为什么.

不应该在"<?"上匹配 防止这需要回溯?我本以为它会尝试找到第一个"<",然后测试表达式的其余部分.如果找不到"<"则会放弃,因为模式显然无法匹配.

这是ICU正则表达式中的错误还是预期的?

regex

2
推荐指数
1
解决办法
552
查看次数

在命令行上将感叹号传递给java程序

我想传递字符串"!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)

java command-line

2
推荐指数
1
解决办法
3005
查看次数