2017-09-11 121 views
3

假設我們有一些(星光)Unicode字符的字符串:如何從一個字符串獲得第n(Unicode)的字符在JavaScript

const s = 'Hi Unicode!' 

[]運營商和.charAt()方法不用於獲取工作第四字符,這應該是「」:

> s[3] 
'�' 
> s.charAt(3) 
'�' 

.codePointAt()確實獲得第四屆字符正確的值,但不幸的是它是一個數,必須轉換BA CK爲字符串使用String.fromCodePoint()

> String.fromCodePoint(s.codePointAt(3)) 
'' 

類似地,字符串轉換成使用層片陣列產生有效的Unicode字符,所以這是獲得第四一個的另一種方式:

> [...s][3] 
'' 

但我可以」不敢相信,從字符串要多少回串,或者是由於到字符串分割成一個數組都在做這種看似瑣碎的事情的唯一途徑。沒有一個簡單的方法來做到這一點?

> s.simpleMethod(3) 
'' 

注:我知道,「性格」的定義有些模糊,但對這個問題的目的,字符僅僅是對應於一個Unicode碼點(無組合字符符號,沒有字形集羣,等等)。

更新說明:String.fromCodePoint(str.codePointAt(n))方法是不是真的可行,因爲n個位置有沒有采取以前的星體符號考慮:String.fromCodePoint(''.codePointAt(1)) // => '�'


(我覺得有點啞問這個,就像我可能缺少一些明顯的東西,但previous answers對這個問題不適用於星體平面上帶有Unicode符號的字符串。)

+1

你見過這個頁面的https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt與一些代碼示例? – ivo

+0

@ivo不,我沒有看到,有趣!代碼示例有一個「固定」版本的charAt,這很有用,但我想知道是否有一種好的方法已經支持語言 – epidemian

+0

它是Javascript。簡單的事情不能這麼簡單:) – jorgonor

回答

3

字符串迭代器是迭代代碼點而不是UCS-2/UTF-16代碼的唯一代碼單位。所以:

const string = 'Hi Unicode!'; 
// Note: The spread operator uses the string iterator under the hood. 
const symbols = [...string]; 
symbols[3]; // '' 

不過,這將與字形集羣或表情符號序列,如‍‍‍ + U+200D ZERO WIDTH JOINER突破:

因此,基於字符串中的索引來獲取特定的代碼點+ + U+200D ZERO WIDTH JOINER + + U+200D ZERO WIDTH JOINER + )。 Text segmentation有幫助。

你真的需要得到字符串中的第4個碼點,雖然?你的用例是什麼?

+0

那麼,處理你的特性爲「破壞」,以及哪個OP特別提到他並不關心,需要專門的語言,如卡納達語,也有複雜的集羣,只能由非常複雜的算法組成的邏輯。 –

+0

感謝Mathias!你關於Unicode的文章是超徹底的! 好的,所以數組spat方法可能是最簡單的方法。這是...我猜不是太好。 回答您實際需要獲得第四個代碼點的問題:不,我的原始用例涉及獲取第一個代碼點。我注意到'str [0]'不適用於某些角色,所以我最終問自己「等等,你從JS中的字符串中得到一個特定的字符到底是怎麼回事?」,在這裏我們是... – epidemian

0

您可以使用新的u標誌,正則表達式,如果它提供給你。

const chars = 'Hi Unicode!'.match(/./ug); 
 
console.log(chars);

相關問題