SlideShare a Scribd company logo
1 of 16
Alibaba Cloud Developers MeetUp #18 AliEaters
OSS SDK compatible with Japanese
2021.07.14
const myself : Introduction = {
name: {
handle : "うし",
},
gender : "bull",
assignment : "AliEaters Sendai Organaizer",
role: {
title : "system engineer",
development : ["PHP", "Java", "JS ", "node.js", "DENO", "LISP", "Ruby", "Golang", "TypeScript", etc … ]
},
SNS : {
twitter : "@tangniuwan",
blog : "arcturus.hateblo.jp"
},
comment : "about 4years have passed since I first met Alibaba Cloud",
remark : "Alibaba Cloud MVP was awarded in Sep. 2019. ",
characteristic : "some developed language lover"
};
* The remarks are personal and not the official views of the organization to which they belong.
Self Introduction
1. SDK of OSS(Object Storage Service)
OSSのSDKを使った
2. Japanese and Chinese
日本語と中国語(繁体字と簡体字)の共通の漢字
3. Fix it
日本語に対応する様にした
4. Wrap Up
まとめ
Agenda
議題
クライアント様がCMで使用する動画を一般公募する為、
動画のアップロードを実施するサイトを構築しました。
〇構成
ECS
Lang : PHP7.x
SDK of OSS(Object Storage Service)
OSSのSDK
OSS SDK
(aliyun-oss-php-
sdk)
OS : CentOS7.x
OSS
Cloud
Monitor
Function
Compute
OSSのSDKでやったこと
ECSからOSS SDK(aliyun-oss-php-sdk)を使用して
投稿された動画ファイルをOSSへアップロードしました。
ちなみにソースコードは、
ドキュメントセンターにあるものを
使用させて頂きました。
via. https://www.alibabacloud.com/help/ja/doc-detail/88473.htm
SDK of OSS(Object Storage Service)
OSSのSDK
が、いざ動作させてテストをしていると
「そんなファイルないよ。 」とエラーが返却されます。
アップロードファイル アップロード処理結果
北海道testテスト.png → testƥ.png file does not exist
見て頂いて分かる通り、日本語が消え文字化けを起こしています。
SDK of OSS(Object Storage Service)
OSSのSDK
なして?
SDK of OSS(Object Storage Service)
OSSのSDK
ということで、GitHubを確認(https://github.com/aliyun/aliyun-oss-php-sdk/)
SDK of OSS(Object Storage Service)
OSSのSDK
ソースコードを追っかけると
OssUtil.php(PATH: /oss-sdk-php/src/OSS/Core/OssUtil.php)の
344行目にあるメソッドで、ファイル名をUTF-8からGBKにエンコードしています。
via. https://github.com/aliyun/aliyun-oss-php-sdk/blob/master/src/OSS/Core/OssUtil.php
SDK of OSS(Object Storage Service)
OSSのSDK
事象
エンコードの際、中国語で且つ、WindowsOSか?を判定していますが、
日本語「北海道testテスト.png」を指定した場合、中国語と誤判定されます。
では何故、日本語を指定しているにも関わらず、「chkChinese」メソッドで、
中国語と判定されるのか?
SDK of OSS(Object Storage Service)
OSSのSDK
メソッド(chkChinese)を確認
preg_match関数で「/[x80-xff]./」が指定されていました。
これは非ASCII文字範囲で、2バイト文字を含まない半角の英数字、記号、制御記号(空白等)が
含まれるか?を判定し、含まれる場合は、ファイル名丸々をUTF-8からGBKに変換しています。
結果、日本語ファイルが誤変換され、文字化けを起こします。
SDK of OSS(Object Storage Service)
OSSのSDK
Japanese and Chinese
日本語と中国語(繁体字と簡体字)の共通の漢字
原因が判明したので修正
とりあえず、日本語だけでもエンコードされない様に。とのことで
先程の「encodePath」メソッドで日本語だったらエンコードされない様にすれば良い。くらいに
考えていましたが、 ここで大きなミスに気づきます。
皆さんご存じだと思いますが…
中国語には、繁体字と簡体字がありますよね。
そして、繁体字と簡体字と日本語で、被る文字って沢山あるよね。。(汗
Japanese and Chinese
日本語と中国語(繁体字と簡体字)の共通の漢字
パターン
例えば、「作」という漢字は、日本語にも繁体字にも簡体字にも存在します。
また「義」という漢字は、日本語と繁体字にはあるけど、
簡体字には違う文字として存在していたりします。
例)パターン一覧
しかも、 CJK統合漢字 と言うモノがあり、例えば「沈」という漢字は、中日韓で言語を問わず同じコード。。
日本語 繁体字 簡体字 パターン
図 圖 图 三者三葉
作 作 作 三者同一
黒 黑 黑 日本語だけ違う
痴 癡 痴 繁体字だけ違う
義 義 义 簡体字だけ違う
Fix it
日本語に対応する様にした
修正方針
という事で、「chkChinese」メソッドの修正内容を以下の方針としコーディングしました。
また、幸い?「checkChar」(GBK=「繁体字・簡体字」を判定するメソッド)や、
「isGb2312」(簡体字を判定するメソッド)が既に実装されており、流用させて頂きました。
・半角文字(1バイトの文字)を削除
・残った文字列に、日本語(ひらがな・カタカナ・漢字)が含まれてたら「日本語」
・更に繁体字か、簡体字で構成されているかを確認
Wrap Up
まとめ
まとめ
・SDKをいじると内部的なものが色々見えてくる。(未確認ですが、AWSのS3SDKとして共用できそう)
・色々な言語でSDKがあるので、各種いじるのが楽しい。
OSSのSDKの改修としては
・朝鮮語など、他言語での動作は不明です。
・ファイル名に日本語が含まれてもエラー無くアップロードが出来ます。
・日本語で使用する分には問題なく動作します。
・ユニットテストが通ったので、イシューたてて、プルリクしたいと思うが意味あるかな?
フォークしたリポジトリ
https://github.com/arcturus-technologies/aliyun-oss-php-sdk
EOF
ご清聴ありがとうございました

More Related Content

Similar to OSS SDK compatible with Japanese.pptx

IBM Log Analysis with LogDNAを評価した話
 IBM Log Analysis with LogDNAを評価した話 IBM Log Analysis with LogDNAを評価した話
IBM Log Analysis with LogDNAを評価した話Daisuke Hiraoka
 
React Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリReact Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリMasayuki Iwai
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespacesIssei Hiraoka
 
AWS as MBaaS 〜APIキーとかの話〜
AWS as MBaaS 〜APIキーとかの話〜AWS as MBaaS 〜APIキーとかの話〜
AWS as MBaaS 〜APIキーとかの話〜Yuki Hirai
 
開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能Masaki Suzuki
 
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化幸雄 村上
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
 
はじめてのAWS Lambda
はじめてのAWS LambdaはじめてのAWS Lambda
はじめてのAWS LambdaMasaki Misawa
 
はじめてのAws lambda
はじめてのAws lambdaはじめてのAws lambda
はじめてのAws lambdadcubeio
 
IDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたIDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたNaohiro Fujie
 
MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!Tetsutaro Watanabe
 
LT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかLT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかKazuya Matsubara
 
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある20181025 若手LT会 Codableあるある
20181025 若手LT会 CodableあるあるIgaHironobu
 
[Scalamatsuri2016]あ、社内コミュニティ
[Scalamatsuri2016]あ、社内コミュニティ[Scalamatsuri2016]あ、社内コミュニティ
[Scalamatsuri2016]あ、社内コミュニティhirotakanosato
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE 陽平 山口
 
AWS Lambda + Python資料 ver0.94 20160825
AWS Lambda + Python資料 ver0.94 20160825AWS Lambda + Python資料 ver0.94 20160825
AWS Lambda + Python資料 ver0.94 20160825Yasuharu Suzuki
 
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)ShogoOkazaki
 

Similar to OSS SDK compatible with Japanese.pptx (20)

IBM Log Analysis with LogDNAを評価した話
 IBM Log Analysis with LogDNAを評価した話 IBM Log Analysis with LogDNAを評価した話
IBM Log Analysis with LogDNAを評価した話
 
React Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリReact Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリ
 
Vscodemeetup6
Vscodemeetup6Vscodemeetup6
Vscodemeetup6
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
 
AWS as MBaaS 〜APIキーとかの話〜
AWS as MBaaS 〜APIキーとかの話〜AWS as MBaaS 〜APIキーとかの話〜
AWS as MBaaS 〜APIキーとかの話〜
 
開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能
 
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
 
Alexa SDK Alexa Salon
Alexa SDK Alexa SalonAlexa SDK Alexa Salon
Alexa SDK Alexa Salon
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
はじめてのAWS Lambda
はじめてのAWS LambdaはじめてのAWS Lambda
はじめてのAWS Lambda
 
はじめてのAws lambda
はじめてのAws lambdaはじめてのAws lambda
はじめてのAws lambda
 
IDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたIDaaSにSign in with Appleをつないでみた
IDaaSにSign in with Appleをつないでみた
 
MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!
 
LT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとかLT駆動開発04 5分では分からないTypeScriptのなんとか
LT駆動開発04 5分では分からないTypeScriptのなんとか
 
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある
 
[Scalamatsuri2016]あ、社内コミュニティ
[Scalamatsuri2016]あ、社内コミュニティ[Scalamatsuri2016]あ、社内コミュニティ
[Scalamatsuri2016]あ、社内コミュニティ
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE
 
AWS Lambda + Python資料 ver0.94 20160825
AWS Lambda + Python資料 ver0.94 20160825AWS Lambda + Python資料 ver0.94 20160825
AWS Lambda + Python資料 ver0.94 20160825
 
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
Rustで DDD を実践しながら API サーバーを実装・構築した(つもり)
 

OSS SDK compatible with Japanese.pptx

Editor's Notes

  1. ※本来は、スタティックなサイトをOSSに設置し、サーバーレスな感じして、そこから直接OSSへアップロードを想定
  2. いたってシンプル。よくあること。
  3. そりゃそうだ、ファイル名が変わっちゃってるもんw
  4. ※GBK  中国で使われている簡体字用の文字コード GB 2312 の拡張です ※赤線  WindowsのデフォルトエンコードがGBKとのことで中国基準になっている(当然と言えば当然ですが) ※赤枠  このエンコード処理の際、中国語で且つ、WindowsOSか?を判定していますが、  日本語ファイル「北海道testテスト.png」を設定していても中国語と判定されます。  つまり、日本語のファイルでも、このメソッドを素通りして、GBKからUTF8変換されます。  当然、GBKに日本語のひらがな、カタカナは無いので空文字に変換されます。  では何故、日本語のファイル名が、中国語と判定されるのか? MicrosoftはGBKをWindows 95でコードページ936として定義した。 GBKが公式規格になったことは一度もないが、Windows 95が広く使われるようになったことによりGBKは事実上の標準となった。 GBKはUnicode 1.1およびGB 13000.1-93で定義されている全ての漢字を含んでいたが、それらとは異なる符号表を使っていた。 GBKの基本的な存在意義は、単にGB 2312-80とGB 13000.1-93の落差の橋渡しであった。 2000年、GB 18030-2000規格が公開されてGBKを置き替えたが、まだ互換性は保たれている。 GB 18030は定義されている漢字の数を増やし、4バイト文字空間の実装によって使用可能な文字数を拡張した。
  5. つまり、半角の英数字、記号など、1バイト文字が有る場合は、UTF-8からGBKに変換しています まぁ、前提が、GBKなので、こういう判定をするのも理解できますが、なかなか、豪快です 笑
  6. つまり、例えば「作義.txt」というファイルがあった場合、日本語とも、繁体字とも取れ、 一概に日本語文字と判定ができないってことになります。 ※ちなみに、ソースコード上に 「GB 2312 - Wikipedia」というものがありますが、調べると簡体字のみサポートしている。。とのこと