LoginSignup
1
0

More than 3 years have passed since last update.

JavaScript 文字列を反転させたい。結合文字とサロゲートペア対応。

Last updated at Posted at 2021-05-04

文字列を反転させたい|nona|note
https://note.com/ttuusskk/n/n6f874b0274bd

反転させたい人は多いらしい。スジャータをタ~ジャスに変えたいとかなんとか。しらんけど。

こんなふうにやろうよね。ってことのようです。

const split = require('graphemesplit'); // npm i graphemesplit

const str0 = '👨‍👩‍👧‍👦🌕の夜に𩸽食べたい'
const str1 = str0 + 'がき';
const str2 = str0 + "\u304b\u3099\u304d";

console.log(str1);  // 👨‍👩‍👧‍👦🌕の夜に𩸽食べたいがき
console.log(str2);  // 👨‍👩‍👧‍👦🌕の夜に𩸽食べたいがき

console.log(
  '👨‍👩‍👧‍👦'.length,
  '🌕'.length,
  '𩸽'.length,
  str0.length, str1.length, str2.length
); // 11 2 2 11 13 14

// NG
console.log(str1.split('').reverse().join('')); // きがいたべ食��に夜の�🁦�‍��‍��‍��
console.log(str2.split('').reverse().join('')); // ぎかいたべ食��に夜の�🁦�‍��‍��‍��

// NG
console.log([...str1].reverse().join('')); // きがいたべ食𩸽に夜の🌕👦‍👧‍👩‍👨
console.log([...str2].reverse().join('')); // ぎかいたべ食𩸽に夜の🌕👦‍👧‍👩‍👨

// better
console.log([...str1.normalize()].reverse().join('')); // きがいたべ食𩸽に夜の🌕👦‍👧‍👩‍👨
console.log([...str2.normalize()].reverse().join('')); // きがいたべ食𩸽に夜の🌕👦‍👧‍👩‍👨

// good
console.log(split(str1).reverse().join('')); // きがいたべ食𩸽に夜の🌕👨‍👩‍👧
console.log(split(str2).reverse().join('')); // きがいたべ食𩸽に夜の🌕👨‍👩‍👧‍

参考

文字列を1文字ずつ配列化(サロゲートペアを考慮) - Qiita
https://qiita.com/sounisi5011/items/aa2d747322aad4850fe7

Unicode と JavaScript の文字列について - Object.create(null)
https://susisu.hatenablog.com/entry/2017/01/25/023338

JavaScriptで絵文字とサロゲートペアと結合文字とgrapheme clusterを正しく扱うのに少し苦労した話 - Qiita
https://qiita.com/amanoese/items/68bb9999829de4323302

文字とは何か?IchigoJam絵文字対応とUnicodeの旅、結合文字対応の文字分割ライブラリJavaScript対応版公開! #js #IchigoJam / 福野泰介の一日一創 / Create every day by Taisuke Fukuno
https://fukuno.jig.jp/2831

JavaScript における文字コードと「文字数」の数え方 | blog.jxck.io
https://blog.jxck.io/entries/2017-03-02/unicode-in-javascript.html

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0