Android中的连字处理

51
作为国际化Android应用程序的一部分,我需要动态换行或在正确位置连字。所有字符串都在strings.xml文件中外部化,但我没有找到有关Android连字的任何文档。我希望能够建议连字位置,类似于我在LaTeX中所做的那样:

http://en.wikipedia.org/wiki/Hyphenation_algorithm

但我没有找到任何迹象表明这是可能的。 框架中是否有我错过的内容?其他人在做什么,例如处理没有明显断句位置的日语字符串?您只是在正确的位置添加空格吗?

我可以动态调整字体大小以适应某些布局,但对于跨越多行的较长消息,那将行不通。 该怎么办?


3
安卓系统是否支持软连字符(U+00AD)? - Anon.
我曾经遇到过韩语和其他语言中单词非常长的类似问题。因此对答案感兴趣。其中一个问题可能是首先分割单词是否可接受? - Emile
3
软连字符在Android 4.4中可用,在4.2中不可用。我想知道它是否在4.3中可用,这是我希望在这个页面上找到的信息。 - arnt
@arnt 请查看我的答案。至少在SAMSUNG设备上,Android 4.3似乎支持它。 - OneWorld
5
SDK 17:无论是­­­­\u00AD 还是 \u200B 都不起作用。SDK 19:\u200B会将一个没有连字符的单词断开。SDK 24:­­­­\u00AD可以正确地断字,\u200B会将一个没有连字符的单词断开。 - Leos Literak
显示剩余7条评论
6个回答

14

这是Android 6 Marshmallow中的新功能。

尝试在你的TextView xml中添加这个。

android:hyphenationFrequency="none"

4
在Android Q及以后,默认设置为“none”。之前不是这样的。 - Malachiasz
我想要添加 setHyphenationFrequency(int)。 - user9599745
从Android Q开始,默认情况下关闭连字以提高性能。如果需要使用,您需要将其打开。https://android-developers.googleblog.com/2019/07/whats-new-for-text-in-android-q.html - Ishaan Kumar

7

软连字号 可在 Android 4.3 及以上版本的三星 Galaxy 设备上使用。

<!-- key combination to enter soft hyphen: [Alt Gr]+[-] or [Alt]+240 on German PC, see https://de.wikipedia.org/wiki/Weiches_Trennzeichen#Darstellung_auf_Computersystemen -->
<string name="no_connection">Nicht ver-bund-en</string>

这里输入图片描述

由于我的使用情况比较狭窄,我只在单词“verbunden”中使用了一个软连字符。 Unicode \u00ad 没有任何效果。


我没有按照duden的规则正确地分割单词。 ;) - OneWorld
1
也许你应该使用 \u00AD(大写字母在最后两个位置)... 对我来说,它完美地工作了!谢谢! - Geryson

7
管理换行可能会很麻烦。最好的选择是使用UTF换行符控制字符,因为Android支持完整的UTF。
我知道有人提到了“软连字号”,但还有一些其他的选项。
在缺少空格的语言中,您还可以在单词之间使用“零宽度空格”,这样您就不必依赖于字典解释。您还可以将其用作某些语言允许在某些点上断开某些单词的软连字号。
当使用一个复合词时,您不希望它被打断,但您希望文本到语音系统正确识别它时,应使用“单词分隔符”字符。不要使用“零宽度非断空格”,因为由于其作为BOM的使用而被弃用。
最后,如果您想要一个空格但不想换行,请使用简单的非断空格。

8
在 XML 资源文件中成功使用了 \u200b 与字符串。 - mach
1
软连字符是一种非常有用的工具,可在针对API 21的Android中使用 - \u00AD https://en.wikipedia.org/wiki/Soft_hyphen - CrimsonX
与任何平台一样,HTML 中使用的常见“&”快捷方式的可用性取决于它们在应用程序中的使用位置。一些小部件通过处理器运行其文本,而另一些则不会。如果您使用国际化字符串表函数来处理字符串(这是绝对必要的),则可以使用 UTF。 - Robert Wm Ruedisueli

6
以下库支持断词功能。它可以帮您完成所有类型的文本对齐(左/右/居中/两端对齐)和断词。尚未添加所有语言,但可以根据需要进行添加。此库不使用WEBVIEW支持SPANNABLES并允许使用长文本: https://github.com/bluejamesbond/TextJustify-Android Android: 2.2到5.X 设置
DocumentView documentView = addDocumentView(new StringBuilder("Your long text content"), DocumentView.PLAIN_TEXT);
documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED);
documentView.getDocumentLayoutParams().setHyphenator(new Hyphenator(HyphenPattern.PT));
documentView.getDocumentLayoutParams().setHyphenated(true);

1
我们如何在textView中设置这个属性?你能否修改一下这个呢? - Nithinjith

3

这个问题很老,但我刚找到了最好的解决方案:

我必须说我是用Xamarin进行编程的,所以代码是用C#编写的,但应该不难转换成java。

我使用了NHyphenator Logic(https://github.com/alkozko/NHyphenator)插入SoftHyphens(UTF8 Symbol - 0x00AD),这样TextView就可以在正确的位置做连字。

为了得到其他语言的连字,我使用了OpenOffice词典。例如,我需要得到德语-瑞士语的连字。

http://extensions.openoffice.org/en/search?f[0]=field_project_tags%3A157 1. 下载扩展 2. 用WinRAR或其他工具解压缩 3. 复制hyph_xx_xx/hyph_xx_xx.dic文件 4. 在Hyphenator类中添加新语言

NHyphernator资源文件声明为: hyph-xx-xx.pat.txt --> 不包含注释的字典文件内容 hyph-xx-xx.hyp.txt --> 包含单词例外的文件,其中连字逻辑不能得出正确结果。
如果有人想要Xamarin便携式库,请告诉我,我可以上传它。
编辑:
在TExtview中,断句策略应设置为平衡。API级别 > 23,否则不使用断句策略。
编辑:
这是Mono/Xamarin代码: https://github.com/sma84/NHyphenator-Mono

1
能否上传 Xamarin 的可移植库? - Huby
1
刚刚上传了。现在已经添加了en_gb、en_us、rus和de_ch语言版本。在readme中添加了如何添加新语言的说明。https://github.com/sma84/NHyphenator-Mono - user1519979

-3

1
虽然这在某些情况下有所帮助,但我真的希望整个文本都可见,只是在正确的位置换行/断字。 - Manfred Moser
我还没有使用省略号,但我认为它会显示整个文本。不过我对想要的位置进行连字处理毫无头绪。 - iarwain01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接