小ネタで恐縮ですがややハマったので書き残しておきます。
さる事情でBacklogテナントAからBacklogテナントBへとプロジェクトの課題(Issue)をマイグレーションする作業をしていた折、遭遇した問題です。
Problem
Backlog4jを利用しマイグレーション(データコピー)のためのツールを作成。
テナントAのプロジェクトの課題を取得し、テナントBのプロジェクトの課題として登録しようとしたところエラーになった。
ステータスコードは400。メッセージは:
Incorrect String: %F0...
チケットをよく見たところ「課題の詳細」(Description)のテキストに絵文字(📋️)が含まれている。
Solution
課題を登録するロジックで 課題の詳細のテキストから絵文字を除去する(あるいは他の文字に置換する):
final String description = "..."; // Backlog APIで取得した課題の詳細(絵文字を含み得る)
final Pattern emojiPattern = Pattern.compile("[\\p{So}\\p{Cn}]");
final Matcher emojiMatcher = emojiPattern.matcher(description);
final String emojilessDescrption = emojiMatcher.replaceAll(""); // 絵文字を除去
final CreateIssueParams newIssue = new CreateIssueParams(...);
newIssue.description(emojilessDescrption); // 課題の登録用パラメータに設定
Backlogはブラウザでアクセスする画面では絵文字を受け付ける。Backlog4jが利用するBacklog APIも、データを取得する要求に対してはその絵文字を含んだテキストを返してくる。しかしデータを登録する要求に対しては絵文字を含んだテキストを受け付けずエラーを返してくる。 Backlogにはドメインが複数ある。backlog.com
でホストされたテナントでは📋️をはじめ多くの絵文字が利用可能なようだが、 backlog.jp
でホストされたテナントでは📋️や👍️は利用不可(一方で✨️などは利用可)。ヌーラボに問い合わせたところこれは「仕様」とのこと(2024/12/25:原因について訂正)。
やや憮然とさせられてしまう動作だが致し方ない。絵文字を除去する。