Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
47e7a05a
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
47e7a05a
编写于
3月 02, 2012
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add some utf16 routines for OS API interop.
上级
14306756
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
128 addition
and
0 deletion
+128
-0
src/libcore/str.rs
src/libcore/str.rs
+128
-0
未找到文件。
src/libcore/str.rs
浏览文件 @
47e7a05a
...
@@ -81,6 +81,10 @@
...
@@ -81,6 +81,10 @@
// Misc
// Misc
is_utf8
,
is_utf8
,
is_utf16
,
to_utf16
,
from_utf16
,
utf16_chars
,
count_chars
,
count_bytes
,
count_chars
,
count_bytes
,
utf8_char_width
,
utf8_char_width
,
char_range_at
,
char_range_at
,
...
@@ -1060,6 +1064,83 @@ fn is_utf8(v: [u8]) -> bool {
...
@@ -1060,6 +1064,83 @@ fn is_utf8(v: [u8]) -> bool {
ret
true
;
ret
true
;
}
}
fn
is_utf16
(
v
:
[
u16
])
->
bool
{
let
len
=
v
.len
();
let
i
=
0u
;
while
(
i
<
len
)
{
let
u
=
v
[
i
];
if
u
<=
0xD7FF_u16
||
u
>=
0xE000_u16
{
i
+=
1u
;
}
else
{
if
i
+
1u
<
len
{
ret
false
;
}
let
u2
=
v
[
i
+
1u
];
if
u
<
0xD7FF_u16
||
u
>
0xDBFF_u16
{
ret
false
;
}
if
u2
<
0xDC00_u16
||
u2
>
0xDFFF_u16
{
ret
false
;
}
i
+=
2u
;
}
}
ret
true
;
}
fn
to_utf16
(
s
:
str
)
->
[
u16
]
{
let
u
=
[];
chars_iter
(
s
)
{|
cch
|
// Arithmetic with u32 literals is easier on the eyes than chars.
let
ch
=
cch
as
u32
;
if
(
ch
&
0xFFFF_u32
)
==
ch
{
// The BMP falls through (assuming non-surrogate, as it should)
assert
ch
<=
0xD7FF_u32
||
ch
>=
0xE000_u32
;
u
+=
[
ch
as
u16
]
}
else
{
// Supplementary planes break into surrogates.
assert
ch
>=
0x1_0000_u32
&&
ch
<=
0x10_FFFF_u32
;
ch
-=
0x1_0000_u32
;
let
w1
=
0xD800_u16
|
((
ch
>>
10
)
as
u16
);
let
w2
=
0xDC00_u16
|
((
ch
as
u16
)
&
0x3FF_u16
);
u
+=
[
w1
,
w2
]
}
}
ret
u
;
}
fn
utf16_chars
(
v
:
[
u16
],
f
:
fn
(
char
))
{
let
len
=
v
.len
();
let
i
=
0u
;
while
(
i
<
len
)
{
let
u
=
v
[
i
];
if
u
<=
0xD7FF_u16
||
u
>=
0xE000_u16
{
f
(
u
as
char
);
i
+=
1u
;
}
else
{
let
u2
=
v
[
i
+
1u
];
assert
u
>=
0xD800_u16
&&
u
<=
0xDBFF_u16
;
assert
u2
>=
0xDC00_u16
&&
u2
<=
0xDFFF_u16
;
let
c
=
(
u
-
0xD800_u16
)
as
char
;
c
=
c
<<
10
;
c
|
=
(
u2
-
0xDC00_u16
)
as
char
;
c
|
=
0x1_0000_u32
as
char
;
f
(
c
);
i
+=
2u
;
}
}
}
fn
from_utf16
(
v
:
[
u16
])
->
str
{
let
buf
=
""
;
reserve
(
buf
,
v
.len
());
utf16_chars
(
v
)
{|
ch
|
push_char
(
buf
,
ch
);
}
ret
buf
;
}
/*
/*
Function: count_chars
Function: count_chars
...
@@ -2223,4 +2304,51 @@ fn test_chars() {
...
@@ -2223,4 +2304,51 @@ fn test_chars() {
assert
[
'ศ'
,
'ไ'
,
'ท'
,
'ย'
,
'中'
,
'华'
,
'V'
,
'i'
,
'ệ'
,
't'
,
' '
,
'N'
,
'a'
,
'm'
]
assert
[
'ศ'
,
'ไ'
,
'ท'
,
'ย'
,
'中'
,
'华'
,
'V'
,
'i'
,
'ệ'
,
't'
,
' '
,
'N'
,
'a'
,
'm'
]
==
chars
(
ss
);
==
chars
(
ss
);
}
}
#[test]
fn
test_utf16
()
{
let
pairs
=
[(
"𐍅𐌿𐌻𐍆𐌹𐌻𐌰
\n
"
,
[
0xd800_u16
,
0xdf45_u16
,
0xd800_u16
,
0xdf3f_u16
,
0xd800_u16
,
0xdf3b_u16
,
0xd800_u16
,
0xdf46_u16
,
0xd800_u16
,
0xdf39_u16
,
0xd800_u16
,
0xdf3b_u16
,
0xd800_u16
,
0xdf30_u16
,
0x000a_u16
]),
(
"𐐒𐑉𐐮𐑀𐐲𐑋 𐐏𐐲𐑍
\n
"
,
[
0xd801_u16
,
0xdc12_u16
,
0xd801_u16
,
0xdc49_u16
,
0xd801_u16
,
0xdc2e_u16
,
0xd801_u16
,
0xdc40_u16
,
0xd801_u16
,
0xdc32_u16
,
0xd801_u16
,
0xdc4b_u16
,
0x0020_u16
,
0xd801_u16
,
0xdc0f_u16
,
0xd801_u16
,
0xdc32_u16
,
0xd801_u16
,
0xdc4d_u16
,
0x000a_u16
]),
(
"𐌀𐌖𐌋𐌄𐌑𐌉·𐌌𐌄𐌕𐌄𐌋𐌉𐌑
\n
"
,
[
0xd800_u16
,
0xdf00_u16
,
0xd800_u16
,
0xdf16_u16
,
0xd800_u16
,
0xdf0b_u16
,
0xd800_u16
,
0xdf04_u16
,
0xd800_u16
,
0xdf11_u16
,
0xd800_u16
,
0xdf09_u16
,
0x00b7_u16
,
0xd800_u16
,
0xdf0c_u16
,
0xd800_u16
,
0xdf04_u16
,
0xd800_u16
,
0xdf15_u16
,
0xd800_u16
,
0xdf04_u16
,
0xd800_u16
,
0xdf0b_u16
,
0xd800_u16
,
0xdf09_u16
,
0xd800_u16
,
0xdf11_u16
,
0x000a_u16
]),
(
"𐒋𐒘𐒈𐒑𐒛𐒒 𐒕𐒓 𐒈𐒚𐒍 𐒏𐒜𐒒𐒖𐒆 𐒕𐒆
\n
"
,
[
0xd801_u16
,
0xdc8b_u16
,
0xd801_u16
,
0xdc98_u16
,
0xd801_u16
,
0xdc88_u16
,
0xd801_u16
,
0xdc91_u16
,
0xd801_u16
,
0xdc9b_u16
,
0xd801_u16
,
0xdc92_u16
,
0x0020_u16
,
0xd801_u16
,
0xdc95_u16
,
0xd801_u16
,
0xdc93_u16
,
0x0020_u16
,
0xd801_u16
,
0xdc88_u16
,
0xd801_u16
,
0xdc9a_u16
,
0xd801_u16
,
0xdc8d_u16
,
0x0020_u16
,
0xd801_u16
,
0xdc8f_u16
,
0xd801_u16
,
0xdc9c_u16
,
0xd801_u16
,
0xdc92_u16
,
0xd801_u16
,
0xdc96_u16
,
0xd801_u16
,
0xdc86_u16
,
0x0020_u16
,
0xd801_u16
,
0xdc95_u16
,
0xd801_u16
,
0xdc86_u16
,
0x000a_u16
])
];
for
(
s
,
u
)
in
pairs
{
assert
to_utf16
(
s
)
==
u
;
assert
from_utf16
(
u
)
==
s
;
assert
from_utf16
(
to_utf16
(
s
))
==
s
;
assert
to_utf16
(
from_utf16
(
u
))
==
u
;
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录