我试图用二进制模式的ofstream写一个wstring文件,但我觉得我做错了.这就是我尝试过的:
ofstream outFile("test.txt", std::ios::out | std::ios::binary);
wstring hello = L"hello";
outFile.write((char *) hello.c_str(), hello.length() * sizeof(wchar_t));
outFile.close();
Run Code Online (Sandbox Code Playgroud)
在例如Firefox中打开test.txt,编码设置为UTF16,它将显示为:
你好
谁能告诉我为什么会这样?
编辑:
在十六进制编辑器中打开文件我得到:
FF FE 68 00 00 00 65 00 00 00 6C 00 00 00 6C 00 00 00 6F 00 00 00
Run Code Online (Sandbox Code Playgroud)
看起来我出于某种原因在每个角色之间得到两个额外的字节?
标准中间接禁止使用可变长度编码.
所以我有几个问题:
如何处理标准的以下部分?
17.3.2.1.3.3宽字符序列
宽字符序列是一个数组对象(8.3.4)A,可以声明为TA [N],其中T是wchar_t(3.9.1)类型,可选择由const或volatile的任意组合限定.数组的初始元素定义了内容,包括由某个谓词确定的元素.字符序列可以由指定其第一元素的指针值S指定.
NTWCS的长度是终止空宽字符之前的元素数.空NTWCS的长度为零.
问题:
basic_string<wchar_t>
operator[]实施以及它返回了什么?
If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.size()返回元素的数量还是字符串的长度?
Returns: a count of the number of char-like objects currently in the string.resize()工作怎么样?
insert(),erase()和其他处理?cwctype
cwchar
getwchar() 显然无法返回整个平台 - 角色,那么这是如何工作的?加上所有其余的角色功能(主题是相同的).
编辑:我将打开奖金以获得一些确认.我希望得到一些明确的答案或至少更明确的投票分配.
编辑:这开始变得毫无意义.这充满了完全相互矛盾的答案.你们有些人谈论外部编码(我不关心那些,UTF-8编码仍然会被存储为UTF-16一旦读入字符串,输出相同),其余只是相互矛盾.: - /
我试图读取UTF-16编码方案中的字符串并对其执行MD5散列.但奇怪的是,当我尝试这样做时,Java和C#会返回不同的结果.
以下是Java中的一段代码:
public static void main(String[] args) {
String str = "preparar mantecado con coca cola";
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(str.getBytes("UTF-16"));
byte[] hash = digest.digest();
String output = "";
for(byte b: hash){
output += Integer.toString( ( b & 0xff ) + 0x100, 16).substring( 1 );
}
System.out.println(output);
} catch (Exception e) {
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:249ece65145dca34ed310445758e5504
以下是C#中的一段代码:
public static string GetMD5Hash()
{
string input = "preparar mantecado con coca cola";
System.Security.Cryptography.MD5CryptoServiceProvider x = new …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多文章,以便知道Unicode代码点的最大数量是多少,但我没有找到最终答案.
据我所知,Unicode代码点被最小化,使得所有UTF-8 UTF-16和UTF-32编码都能够处理相同数量的代码点.但是这个代码点的数量是多少?
我遇到的最常见的答案是Unicode代码点在0x000000到0x10FFFF(1,114,112代码点)的范围内,但我还在其他地方读过它是1,112,114个代码点.那么要给出一个数字还是比这更复杂的问题?
我通过选择Export-> Related files 从OECD http://stats.oecd.org/Index.aspx?datasetcode=CRS1("CRS 2013 data.txt')下载文件.我想在Ubuntu(14.04 LTS)中使用此文件.
当我跑:
dos2unix CRS\ 2013\ data.txt
Run Code Online (Sandbox Code Playgroud)
我知道了:
dos2unix: Binary symbol 0x0004 found at line 1703
dos2unix: Skipping binary file CRS 2013 data.txt
Run Code Online (Sandbox Code Playgroud)
我检查文件的编码:
file --mime-encoding CRS\ 2013\ data.txt
Run Code Online (Sandbox Code Playgroud)
并看到:
CRS 2013 data.txt: utf-16le
Run Code Online (Sandbox Code Playgroud)
我做:
iconv -l | grep utf-16le
Run Code Online (Sandbox Code Playgroud)
这不会返回任何东西,所以我这样做:
iconv -l | grep UTF-16LE
Run Code Online (Sandbox Code Playgroud)
返回:
UTF-16LE//
Run Code Online (Sandbox Code Playgroud)
然后我跑:
iconv --verbose -f UTF-16LE -t UTF-8 CRS\ 2013\ data.txt -o crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)
并检查:
file --mime-encoding crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)
并看到:
crs_2013_data_temp.txt: utf-8
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
dos2unix crs_2013_data_temp.txt
Run Code Online (Sandbox Code Playgroud)
得到:
dos2unix: Binary …Run Code Online (Sandbox Code Playgroud) 如何在Swift中将字符串转换为unicode(UTF-8)字符串?
在目标中我可以像这样写smth:
NSString *str = [[NSString alloc] initWithUTF8String:[strToDecode cStringUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)
如何在Swift中做类似的smth?
(在.NET中)我将任意二进制数据存储在byte [](例如图像)中.现在,我需要将该数据存储在字符串中(遗留API的"注释"字段).是否有将二进制数据打包成字符串的标准技术?通过"打包",我的意思是对于任何合理大的随机数据集,bytes.Length/2与packed.Length大致相同; 因为两个字节或多或少是一个字符.
这两个"明显"的答案不符合所有标准:
string base64 = System.Convert.ToBase64String(bytes)
Run Code Online (Sandbox Code Playgroud)
没有非常有效地使用字符串,因为它只使用大约60,000个可用的64个字符(我的存储是System.String).一起去
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
Run Code Online (Sandbox Code Playgroud)
更好地利用字符串,但它不适用于包含无效Unicode字符的数据(例如错误匹配的代理项对). 这篇MSDN文章展示了这种精确(差)技术.
我们来看一个简单的例子:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,bytes和utf16_bytes是相同的,因为原始字节是UTF-16字符串.使用base64编码执行相同的过程会产生16个成员的base64_bytes数组.
现在,使用无效的UTF-16数据重复该过程:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
Run Code Online (Sandbox Code Playgroud)
您会发现utf16_bytes与原始数据不匹配.
我编写的代码使用U + FFFD作为无效Unicode字符之前的转义; 它有效,但我想知道是否有一种比我自己制作的更标准的技术.更何况,我不喜欢 …
UTF-16代理区域(U + D800..U + DFFF)的位置是随机选择还是有一些逻辑上的原因,它是在这个地方?
是否可以自定义Emacs以便rgrep在UTF8(甚至拉丁文)和UTF16文件中正确查找某些模式的出现?
我想我们应该定制grep-find-template,但不能通过它.
编辑2017-06-16
我现在有一个为shell 工作utf-8/16 cat命令的例子.grep如果可能的话,它应该转换为Emacs的.这里是:
cat $1 | ( [[ $(file -i $1) =~ utf-16be ]] && ( iconv -f UTF-16 -t UTF-8 || true ) || cat )
Run Code Online (Sandbox Code Playgroud)