可以说我有角色Ú,Ù,Ü.所有这些都与英语U字面相似.
是否有一些列表或算法来执行此操作:
我不确定所有字体的Unicode字符的代码点是否相同?如果是的话,我想可以有一些简单的方法和有效的方法来做到这一点?
UPDATE
如果你正在使用Ruby,那么有一个可用于unicode的gem 可能会在某些情况下有所帮助.
tch*_*ist 28
目前还不清楚你要求做什么.
有人物,其规范分解全部以相同的基本性格:E,E,E,E,E,E,E,E,E,ȅ,ȇ,ȩ,E,E,E,E,E,E, E,E,E,E,E,E,E,E,... 或 S,S,S,S,S,S,S,S,S,S,S,....
有人物,其兼容性分解都包含特定字符:ᵉ,ₑ,ℯ,ⅇ,⒠,ⓔ,㋍,㋎,E,... 或 S,S,ˢ,F,₨,℁,⒮,ⓢ,㎧, ㎨,㎮,㎯,㎰,㎱,㎲,㎳,㏛,ft,st,s,... 或 R,ᴿ,₨,ℛ,ℜ,ℝ,Ⓡ,㏚,R,....
有迹象表明,字符恰好看起来很像在一些字体:SS和β和β,或 3和ʒ和Ȝ和ȝ和ʒ和ӡ和ᴣ,或 ɣ和ɤ和γ,或 F和Ϝ和ϝ,或乙和Β和В,或 ∅和○和0和O和0和0和0和0,或 1和l和I和Ⅰ以及ᛁ和| 和|和|,....
不区分大小写的字符,如s和S和s,或 ss和Ss以及SS和ß和ẞ,....
字符都具有相同的数值,像所有这些为值1:1¹11߁1111୧11౹౼1111111፩1៱᠑᥇᧑᧚᪁᪑᭑᮱᱁᱑₁⅟①⑴⒈ ⓵❶➀➊꘡꣑꤁꧑꩑꯱Ⅰⅰꛦ㆒㈠㊀ .
所有这些都具有相同的主要校对强度的字符,就像所有这些与d:DdÐðĎďĐđ◌ͩᴰᵈᶞ◌ᷘ◌ᷙḊḋḌḍḎḏḐḑḒḓⅅⅆⅮⅾⒹⓓꝹꝺDd 相同.请注意,其中一些不能通过任何类型的分解访问,但只能通过DUCET/UCA值; 例如,相当常见的ð或新的ꝺ只能通过主UCA强度比较等同于d; 与ƶ和z,ȼ和c等相同
在某些语言环境中相同的字符,如æ和ae,或 ä和ae,或 ä和aa,或MacKinley和McKinley,....... 请注意,语言环境可以产生很大的不同,因为在某些语言环境中,c和ç是相同的字符,而在其他语言环境中它们不是; 同样适用于n和ñ,或 a和á和ã,....
其中一些可以处理.有些人不能.根据不同的需要,所有都需要不同的方法
你的真正目标是什么?
Mar*_*nen 11
这不适用于所有条件,但摆脱大多数重音的一种方法是将字符转换为其分解形式,然后丢弃组合重音:
# coding: utf8
import unicodedata as ud
s=u'U, Ù, Ú, Û, Ü, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?'
print ud.normalize('NFD',s).encode('ascii','ignore')
Run Code Online (Sandbox Code Playgroud)
U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U
Run Code Online (Sandbox Code Playgroud)
要查找重音字符,请使用以下内容:
import unicodedata as ud
import string
def asc(unichr):
return ud.normalize('NFD',unichr).encode('ascii','ignore')
U = u''.join(unichr(i) for i in xrange(65536))
for c in string.letters:
print u''.join(u for u in U if asc(u) == c)
Run Code Online (Sandbox Code Playgroud)
aàáâãäå???????????????????????
b???
cç?????
d??????
eèéêë?????????????????????
f?
:
etc.
Run Code Online (Sandbox Code Playgroud)
为什么不只是将字形与这样的东西进行比较?
package similarglyphcharacterdetector;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.font.FontRenderContext;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class SimilarGlyphCharacterDetector {
static char[] TEST_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890".toCharArray();
static BufferedImage[] SAMPLES = null;
public static BufferedImage drawGlyph(Font font, String string) {
FontRenderContext frc = ((Graphics2D) new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY).getGraphics()).getFontRenderContext();
Rectangle r= font.getMaxCharBounds(frc).getBounds();
BufferedImage res = new BufferedImage(r.width, r.height, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g = (Graphics2D) res.getGraphics();
g.setBackground(Color.WHITE);
g.fillRect(0, 0, r.width, r.height);
g.setPaint(Color.BLACK);
g.setFont(font);
g.drawString(string, 0, r.height - font.getLineMetrics(string, g.getFontRenderContext()).getDescent());
return res;
}
private static void drawSamples(Font f) {
SAMPLES = new BufferedImage[TEST_CHARS.length];
for (int i = 0; i < TEST_CHARS.length; i++)
SAMPLES[i] = drawGlyph(f, String.valueOf(TEST_CHARS[i]));
}
private static int compareImages(BufferedImage img1, BufferedImage img2) {
if (img1.getWidth() != img2.getWidth() || img1.getHeight() != img2.getHeight())
throw new IllegalArgumentException();
int d = 0;
for (int y = 0; y < img1.getHeight(); y++) {
for (int x = 0; x < img1.getWidth(); x++) {
if (img1.getRGB(x, y) != img2.getRGB(x, y))
d++;
}
}
return d;
}
private static int nearestSampleIndex(BufferedImage image, int maxDistance) {
int best = Integer.MAX_VALUE;
int bestIdx = -1;
for (int i = 0; i < SAMPLES.length; i++) {
int diff = compareImages(image, SAMPLES[i]);
if (diff < best) {
best = diff;
bestIdx = i;
}
}
if (best > maxDistance)
return -1;
return bestIdx;
}
public static void main(String[] args) throws Exception {
Font f = new Font("FreeMono", Font.PLAIN, 13);
drawSamples(f);
HashMap<Character, StringBuilder> res = new LinkedHashMap<Character, StringBuilder>();
for (char c : TEST_CHARS)
res.put(c, new StringBuilder(String.valueOf(c)));
int maxDistance = 5;
for (int i = 0x80; i <= 0xFFFF; i++) {
char c = (char)i;
if (f.canDisplay(c)) {
int n = nearestSampleIndex(drawGlyph(f, String.valueOf(c)), maxDistance);
if (n != -1) {
char nc = TEST_CHARS[n];
res.get(nc).append(c);
}
}
}
for (Map.Entry<Character, StringBuilder> entry : res.entrySet())
if (entry.getValue().length() > 1)
System.out.println(entry.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
AÀÁÂÃÄÅ???????????????????????
B?????????
C????????????
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6914 次 |
最近记录: |