开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
Java12Source
/
src
/
java.base
/
java
/
lang
/
CharacterName.java
Java12Source
/
src
/
java.base
/
java
/
lang
/
CharacterName.java
CharacterName.java 6.47 KB
一键复制 编辑 原始数据 按行查看 历史
Stefan 提交于 2021年03月18日 23:35 +08:00 . init
/*
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.lang;
import java.io.DataInputStream;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.util.Arrays;
import java.util.Locale;
import java.util.zip.InflaterInputStream;
import java.security.AccessController;
import java.security.PrivilegedAction;
class CharacterName {
private static SoftReference<CharacterName> refCharName;
// codepoint -> bkIndex -> lookup -> offset/len
private final byte[] strPool;
private final int[] lookup; // code point -> offset/len in strPool
private final int[] bkIndices; // code point -> lookup index
// name -> hash -> hsIndices -> cpEntries -> code point
private final int[] cpEntries; // code points that have name in strPool
private final int[] hsIndices; // chain heads, hash indices into "cps"
private CharacterName() {
try (DataInputStream dis = new DataInputStream(new InflaterInputStream(
AccessController.doPrivileged(new PrivilegedAction<>() {
public InputStream run() {
return getClass().getResourceAsStream("uniName.dat");
}
})))) {
int total = dis.readInt();
int bkNum = dis.readInt();
int cpNum = dis.readInt();
int cpEnd = dis.readInt();
byte ba[] = new byte[cpEnd];
lookup = new int[bkNum * 256];
bkIndices = new int[(Character.MAX_CODE_POINT + 1) >> 8];
strPool = new byte[total - cpEnd];
cpEntries = new int[cpNum * 3];
hsIndices = new int[(cpNum / 2) | 1];
Arrays.fill(bkIndices, -1);
Arrays.fill(hsIndices, -1);
dis.readFully(ba);
dis.readFully(strPool);
int nameOff = 0;
int cpOff = 0;
int cp = 0;
int bk = -1;
int prevBk = -1; // prev bkNo;
int idx = 0;
int next = -1;
int hash = 0;
int hsh = 0;
do {
int len = ba[cpOff++] & 0xff;
if (len == 0) {
len = ba[cpOff++] & 0xff;
// always big-endian
cp = ((ba[cpOff++] & 0xff) << 16) |
((ba[cpOff++] & 0xff) << 8) |
((ba[cpOff++] & 0xff));
} else {
cp++;
}
// cp -> name
int hi = cp >> 8;
if (prevBk != hi) {
bk++;
bkIndices[hi] = bk;
prevBk = hi;
}
lookup[(bk << 8) + (cp & 0xff)] = (nameOff << 8) | len;
// name -> cp
hash = hashN(strPool, nameOff, len);
hsh = (hash & 0x7fffffff) % hsIndices.length;
next = hsIndices[hsh];
hsIndices[hsh] = idx;
idx = addCp(idx, hash, next, cp);
nameOff += len;
} while (cpOff < cpEnd);
} catch (Exception x) {
throw new InternalError(x.getMessage(), x);
}
}
private static final int hashN(byte[] a, int off, int len) {
int h = 1;
while (len-- > 0) {
h = 31 * h + a[off++];
}
return h;
}
private int addCp(int idx, int hash, int next, int cp) {
cpEntries[idx++] = hash;
cpEntries[idx++] = next;
cpEntries[idx++] = cp;
return idx;
}
private int getCpHash(int idx) { return cpEntries[idx]; }
private int getCpNext(int idx) { return cpEntries[idx + 1]; }
private int getCp(int idx) { return cpEntries[idx + 2]; }
public static CharacterName getInstance() {
SoftReference<CharacterName> ref = refCharName;
CharacterName cname = null;
if (ref == null || (cname = ref.get()) == null) {
cname = new CharacterName();
refCharName = new SoftReference<>(cname);
}
return cname;
}
public String getName(int cp) {
int off = 0;
int bk = bkIndices[cp >> 8];
if (bk == -1 || (off = lookup[(bk << 8) + (cp & 0xff)]) == 0)
return null;
@SuppressWarnings("deprecation")
String result = new String(strPool, 0, off >>> 8, off & 0xff); // ASCII
return result;
}
public int getCodePoint(String name) {
byte[] bname = name.getBytes(java.nio.charset.StandardCharsets.ISO_8859_1);
int hsh = hashN(bname, 0, bname.length);
int idx = hsIndices[(hsh & 0x7fffffff) % hsIndices.length];
while (idx != -1) {
if (getCpHash(idx) == hsh) {
int cp = getCp(idx);
int off = -1;
int bk = bkIndices[cp >> 8];
if (bk != -1 && (off = lookup[(bk << 8) + (cp & 0xff)]) != 0) {
int len = off & 0xff;
off = off >>> 8;
if (bname.length == len) {
int i = 0;
while (i < len && bname[i] == strPool[off++]) {
i++;
}
if (i == len) {
return cp;
}
}
}
}
idx = getCpNext(idx);
}
return -1;
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/stefanpy/Java12Source.git
git@gitee.com:stefanpy/Java12Source.git
stefanpy
Java12Source
Java12Source
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /