かなり飽和状態のトピックの詳細について質問があるのではないかと思います。よく検索しましたが、その特定の明白な-非常に重要な問題に対する明確な答えを見つけることができませんでした。
UTF-8を使用してbyte[]をStringに変換する場合、各バイト(8ビット)はUTF-8でエンコードされた8ビット文字になりますが、各UTF-8文字はjavaでは16ビット文字として保存されます。あれは正しいですか?はいの場合、これは、各愚かなJava文字が最初の8ビットのみを使用し、メモリを2倍消費することを意味しますか?それも正しいですか?この無駄な行動はどのように受け入れられるのだろうか。
8ビットの疑似文字列を作成するためのトリックはありませんか?それは実際にメモリ消費量を減らすことになりますか?または、このメモリの浪費を回避するために、1つのJava 16ビット文字に2つ以上の8ビット文字を格納する方法はありますか?
紛らわしい答えをありがとう...
編集:こんにちは、答えてくれてありがとう。UTF-8の可変長プロパティを知っていました。しかし、私のソースは8ビットのバイトであるため、8ビットのUTF-8ワードしか必要ないことを(明らかに間違って)理解しました。UTF-8変換は、CLIで「catsomebinary」を実行したときに表示される奇妙な記号を実際に保存していますか?UTF-8は、バイトの可能な8ビットワードのそれぞれをUTF-8の特定の8ビットワードにマップするために何らかの形で使用されていると思いました。間違い?Base64を使用することを考えましたが、7ビットしか使用しないので悪いです。
再定式化された質問:バイトを文字列に変換するよりスマートな方法はありますか?byte[]をchar[]にキャストするのが好きかもしれませんが、それでも16ビットワードがあります。
追加のユースケース情報:
Jedis (NoSQL RedisのJavaクライアント)をhypergraphDBの「プリミティブストレージレイヤー」として採用しています。つまり、jedisは別の「データベース」のデータベースです。私の問題は、常にbyte []データをjedisにフィードする必要があることですが、内部的には、> Redis <(実際のサーバー)は「バイナリセーフ」文字列のみを処理しています。RedisはCで記述されているため、charは8ビット長であり、AFAIKは7ビットのASCIIIではありません。ただし、JedisのJavaの世界では、すべての文字は内部で16ビット長です。私はこのコードを(まだ)理解していませんが、jedisがこのjava 16ビット文字列をRedis準拠の8ビット文字列に変換すると思います(([ここ] [3])。これはFilterOutputStreamを拡張すると言っています。バイパスすることを望んでいます。 byte [] <->文字列変換をすべて行い、そのFilteroutputstreamを使用します...?)
今、私は疑問に思います:バイト[]と文字列を常に相互変換する必要があり、データサイズが非常に小さいものから潜在的に非常に大きいものまである場合、Java内で各8ビット文字を16ビットとして渡すためのメモリの大きな浪費はありませんか? ?