我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(š).当我试图编写一些与构建相关的东西时,我们偶然发现了一个问题 - 我们无法将š字母传递给命令行工具.命令提示符或其他什么不是搞砸了,并且tf.exe实用程序找不到指定的项目.
我已经尝试了.bat文件的不同格式(ANSI,带有和不带BOM的 UTF-8 )以及用JavaScript编写脚本(这本身就是Unicode) - 但没有运气.如何执行程序并将其传递给Unicode命令行?
我想知道这两个选项中哪一个更安全:
#define MAXLEN 255
char buff[MAXLEN + 1]
Run Code Online (Sandbox Code Playgroud)
sprintf(buff, "%.*s", MAXLEN, name)
snprintf(buff, MAXLEN, "%s", name)
我的理解是两者都是一样的.请建议.
我正在用C++编写一个跨平台的应用程序.所有字符串都在内部进行UTF-8编码.请考虑以下简化代码:
#include <string>
#include <iostream>
int main() {
std::string test = u8"Greek: ????; German: Übergrößenträger";
std::cout << test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Unix系统上,std::cout期望8位字符串是UTF-8编码的,所以这段代码工作正常.
但是,在Windows上,要求std::cout8位字符串采用Latin-1或类似的非Unicode格式(取决于代码页).这导致以下输出:
希腊语:????????; 德语:?£bergr?Âentr?ñger
如何std::cout在Windows上将8位字符串解释为UTF-8?
这是我试过的:
#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U8TEXT);
std::string test = u8"Greek: ????; German: Übergrößenträger";
std::cout << test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望_setmode能做到这一点.但是,这会在调用的行中导致以下断言错误operator<<:
Microsoft Visual C++运行时库
调试断言失败!
程序:d:\ visual studio 2015\Projects\utf8test\Debug\utf8test.exe文件:minkernel\crts\ucrt\src\appcrt\stdio\fputc.cpp行:47
表达式:((_Stream.is_string_backed())||(fn = _fileno(_Stream.public_stream()),((_ textmode_safe(fn)== __crt_lowio_text_mode :: ansi)&&!_ tm_unicode_safe(fn)))) …
我需要在wstring和string之间进行转换.我想,使用codecvt facet应该可以解决问题,但它似乎不适用于utf-8语言环境.
我的想法是,当我将utf-8编码文件读取到字符时,一个utf-8字符被读入两个普通字符(这就是utf-8的工作原理).我想从我的代码中使用的库的wstring表示创建这个utf-8字符串.
有谁知道怎么做?
我已经尝试过了:
locale mylocale("cs_CZ.utf-8");
mbstate_t mystate;
wstring mywstring = L"??žýáí";
const codecvt<wchar_t,char,mbstate_t>& myfacet =
use_facet<codecvt<wchar_t,char,mbstate_t> >(mylocale);
codecvt<wchar_t,char,mbstate_t>::result myresult;
size_t length = mywstring.length();
char* pstr= new char [length+1];
const wchar_t* pwc;
char* pc;
// translate characters:
myresult = myfacet.out (mystate,
mywstring.c_str(), mywstring.c_str()+length+1, pwc,
pstr, pstr+length+1, pc);
if ( myresult == codecvt<wchar_t,char,mbstate_t>::ok )
cout << "Translation successful: " << pstr << endl;
else cout << "failed" << endl;
return 0;
Run Code Online (Sandbox Code Playgroud)
它为cs_CZ.utf-8语言环境返回'failed',并且对cs_CZ.iso8859-2语言环境正常工作.
这是我尝试这样做的方式:
#include <stdio.h>
#include <windows.h>
using namespace std;
int main() {
SetConsoleOutputCP(CP_UTF8);
//german chars won't appear
char const* text = "aäbcdefghijklmnoöpqrsßtuüvwxyz";
int len = MultiByteToWideChar(CP_UTF8, 0, text, -1, 0, 0);
wchar_t *unicode_text = new wchar_t[len];
MultiByteToWideChar(CP_UTF8, 0, text, -1, unicode_text, len);
wprintf(L"%s", unicode_text);
}
Run Code Online (Sandbox Code Playgroud)
效果是只显示我们的ascii字符.没有显示错误.源文件以utf8编码.
那么,我在这里做错了什么?
到WouterH:
int main() {
SetConsoleOutputCP(CP_UTF8);
const wchar_t *unicode_text = L"aäbcdefghijklmnoöpqrsßtuüvwxyz";
wprintf(L"%s", unicode_text);
}
Run Code Online (Sandbox Code Playgroud)
第三步:
#include <stdio.h>
#define _WIN32_WINNT 0x05010300
#include <windows.h>
#define _O_U16TEXT 0x20000
#include <fcntl.h>
using namespace std;
int main() { …Run Code Online (Sandbox Code Playgroud)