在与CharacterSet我合作时遇到了一个有趣的问题.从我到目前为止收集的CharacterSet是基于UnicodeScalar; 您可以使用标量初始化它并检查集合中是否包含标量.查询集合以查明它是否包含a Character,谁的字形可能由几个unicode标量值组成,这没有意义.
我的问题在于我使用表情符号测试,这是一个单一的unicode标量值(十进制128518).因为这是一个单一的unicode标量值,我认为它会起作用,结果如下:
"" == UnicodeScalar(128518)! // true
// A few variations to show exactly what is being set up
let supersetA = CharacterSet(charactersIn: "")
let supersetB = CharacterSet(charactersIn: "A")
let supersetC = CharacterSet(charactersIn: UnicodeScalar(128518)!...UnicodeScalar(128518)!)
let supersetD = CharacterSet(charactersIn: UnicodeScalar(65)...UnicodeScalar(65)).union(CharacterSet(charactersIn: UnicodeScalar(128518)!...UnicodeScalar(128518)!))
supersetA.contains(UnicodeScalar(128518)!) // true
supersetB.contains(UnicodeScalar(128518)!) // false
supersetC.contains(UnicodeScalar(128518)!) // true
supersetD.contains(UnicodeScalar(128518)!) // false
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果CharacterSet包含单个标量值(可能是由于优化),则检查有效,但在任何其他情况下,它都无法按预期工作.
我找不到任何有关较低级别实现的信息,CharacterSet或者它是否以某种编码工作(即UTF-16之类的NSString),但由于API处理很多,UnicodeScalar我很惊讶它失败了,我不确定为什么会发生这种情况,或者如何进一步调查.
任何人都可以阐明为什么会这样吗?
我对这一行感到困惑:
sum += a[s[i] - '0'];
Run Code Online (Sandbox Code Playgroud)
给出一些上下文,这是代码的其余部分:
#include <iostream>
using namespace std;
int main() {
int a[5];
for (int i = 1; i <= 4; i++)
cin >> a[i];
string s;
cin >> s;
int sum = 0;
for (int i = 0; i < s.size(); i++)
sum += a[s[i] - '0'];
cout << sum << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如果我创建一个具有基本单字节特定字符集(如 (0008,0005) = ISO_IR 100)的 DICOM 对象,其中一个标签可以使用不同的 2 字节字符集吗?例如,患者姓名 (0010,0010) 可以用简体中文 (ISO 2022 IR 58) 编码吗?
我尝试打印内容CharacterSet.decimalDigits:
print(CharacterSet.decimalDigits)
Run Code Online (Sandbox Code Playgroud)
输出:CFCharacterSet 预定义十进制数字集
但我的期望是这样的:
[1,2,3,4...]
所以我的问题是:如何打印 的内容CharacterSet.decimalDigits?
通过上述更改,我们可以将表情符号保存在我们的列中。
问题: 1)我是否需要删除现有索引(varchar 列)并重新创建索引,如之前使用 utf8 每个字符占用 3 个字节,现在使用 utf8mb4 编码它将占用 4 个字节?
我有一个字符串变量,其中包含我需要在代码页中编码并写入文件的文本UTF-16LE。
目前,以下代码生成一个UTF-8文件,但我在语句中没有看到任何选项OPEN DATASET来生成UTF-16LE.
REPORT zmyprogram.
DATA(filename) = `/tmp/myfile`.
OPEN DATASET filename IN TEXT MODE ENCODING DEFAULT FOR OUTPUT.
TRANSFER 'HELLO WORLD' TO filename.
CLOSE DATASET filename.
Run Code Online (Sandbox Code Playgroud)
我想一种解决方案是首先在内存中对字符串进行编码,然后将编码后的字节写入文件。
一般来说,如何将一串字符编码到内存中给定的代码页中?