2012-08-15 48 views
4

如果我有一個Java字符串[s1,s2,s3,s4, ...., sn]的字典排序列表,然後將每個字符串轉換爲一個字節數組,使用UTF-8編碼bx = sx.getBytes("UTF-8"),是字節數組的列表[b1,b2,b3,...bn]也是按字典排序的?Java String.getBytes(「UTF-8」)是否保留lexicograhpical順序?

+2

因爲UTF-8是一個可變寬度編碼,我會說排序順序不會被保留 – 2012-08-15 23:11:39

+0

我不確定你的問題是否有意義;你會如何按字典順序排列比特/字節?您將這些位/字節映射到的字符集是決定性因素。 – 2012-08-15 23:14:13

+0

@Brian Roach字節數組上的字典順序與字符串上的字典順序相似。只需將「x處的字符」替換爲「x處的字節」。見例如http://stackoverflow.com/questions/5108091/java-comparator-for-byte-array-lexicographic – Carsten 2012-08-15 23:32:51

回答

5

是的。根據RFC 3239

UTF-8字符串的字節值字典分類順序是 一樣的,如果通過字符數目排序。當然這是 有限的興趣,因爲基於字符數字的排序順序是 幾乎從來沒有文化上的有效。

正如伊恩·羅伯茨指出,這適用於 「真正 UTF-8(如String.getBytes給你)」,但要注意的DataInputStream's fake UTF-8,這將排序[U + 000000]後,[U + 000001 ]和[U + 10FFFF]之後的[U + 00F000]。

+0

爲了完整性,請注意這對於_true_ UTF-8是正確的(比如'String.getBytes'會給你),但對於「DataInputStream」使用的「[修改的UTF-8](http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#modified-utf-8)」和朋友。 – 2012-08-16 00:17:52

+0

@IanRoberts:對。事實上,在[U + 10FFFF]之後的[U + 000001]和[U + 00F000]之後,修改的UTF-8排序[U + 000000]。 – 2012-08-16 00:31:25

+0

您確定這個回答正確嗎?對於基於UTF-16而非Unicode代碼點的字符串,不是正常的Java字典順序? – 2013-10-14 06:20:24

-2

您在給定的orden中獲得對象X的列表/數組。

您可以使用一種方法創建這些對象的新列表/數組Y. Y將具有您創建它的順序(通常您將保留X順序)。沒有重新排序。

此外,對字節[]的詞法排序沒有意義。

+3

字節[]的字典排序並不意味着無意義。見例如http://stackoverflow.com/questions/5108091/java-comparator-for-byte-array-lexicographic – Carsten 2012-08-15 23:34:00

相關問題