如何生成随机 unicode 字符串?
How to generate random unicode strings?
出于测试目的,您可能希望向某个方法提供随机输入,但像 scala.util.Random.alphanumeric
这样的字母数字生成器在许多情况下并不能涵盖所有可能的输入。
生成给定长度的随机 unicode 字符串的最佳方法是什么?
考虑 ScalaCheck generators,例如
import org.scalatest._
import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks
import org.scalacheck.{Arbitrary, Gen}
class AlphanumericGeneratorSpec extends FlatSpec with Matchers with ScalaCheckDrivenPropertyChecks {
"Arbitrary.arbString" should "generate arbitrary strings" in {
forAll(Arbitrary.arbString.arbitrary) { s =>
println(s)
}
}
}
输出类似于
⦍鸟㗴鲪ᬎ㺥
䊪仍ୁ㕃댊벝蛎瓊倊錾釨㚺㥌ੜ
仁벵ຝ洱霷쀙쵟㹳灢瑤쌴
詢蓫䑽ᵋ앹䦆딂ᄬ鉖
醃䦼컠᳞遱掊醌涰ᚕ苇泟Ễ㒪뭩綗ᄍ䉱屮藓䦆䜜㴹煉ں㸲䛊ᓠ셴켶䦖垯ᡤ卆婱羘畕⁋䢅ﯫ訆݊ⵕ건
썁㙁䠼臩蚁䬣ݍ⓸⤵犕꺭ཛྷ잁闓襥鯽啌ꟴ翏㫺ܪሷ뢛快腊机ᰵ蟽ﳥɴ馣䪚軇鿾㹄Ꝓ㿈뿭땧颟ᜒ纈ꔧ毚뒢兊屼
矵귳옘䕌Ⱌ`凣쐕튌ằ惿獄ꍝ䫗끒뮌錑㶩ዒ絽鹣煋襁ꨔᔵ팋屜姙ꙇᡛ뾗꘎焑酸ಹ乵텣쳊疟䉴투꿠㱎ᅧ텎ᑽﹽ跡
橛櫯ꆠ葲逊ᵈ엦災盨捻棉䟔縆⦽㯠侄ᙑד볓끀謹翆滳ץ픎Ꝛ餮范샥➮⊠㇔鐿詥ꊔ텦䟑徜ꮉ绳䜁빎학⮴䑢悋铃揍挛⭂장踛ﻥ螴阶ퟠ햇
ᶭ䯵꧓擃轤ꦧꦛ
设置固定size尝试
def arbUnicodeGen(size: Int) =
Gen.listOfN(size, Arbitrary.arbChar.arbitrary).map(_.mkString)
然后
"arbUnicodeGen" should "generate fixed length arbitrary strings" in {
forAll(arbUnicodeGen(10)) { s =>
println(s)
}
}
它可以在没有可变缓冲区或变量的情况下完成。
import java.lang.Character
import util.Random
def randomUnicodeString(length: Int) =
LazyList.continually(Random.nextInt(0xFFFF))
.collect{case c if Character.isDefined(c) => c.toChar}
.take(length)
.mkString
出于测试目的,您可能希望向某个方法提供随机输入,但像 scala.util.Random.alphanumeric
这样的字母数字生成器在许多情况下并不能涵盖所有可能的输入。
生成给定长度的随机 unicode 字符串的最佳方法是什么?
考虑 ScalaCheck generators,例如
import org.scalatest._
import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks
import org.scalacheck.{Arbitrary, Gen}
class AlphanumericGeneratorSpec extends FlatSpec with Matchers with ScalaCheckDrivenPropertyChecks {
"Arbitrary.arbString" should "generate arbitrary strings" in {
forAll(Arbitrary.arbString.arbitrary) { s =>
println(s)
}
}
}
输出类似于
⦍鸟㗴鲪ᬎ㺥
䊪仍ୁ㕃댊벝蛎瓊倊錾釨㚺㥌ੜ
仁벵ຝ洱霷쀙쵟㹳灢瑤쌴
詢蓫䑽ᵋ앹䦆딂ᄬ鉖
醃䦼컠᳞遱掊醌涰ᚕ苇泟Ễ㒪뭩綗ᄍ䉱屮藓䦆䜜㴹煉ں㸲䛊ᓠ셴켶䦖垯ᡤ卆婱羘畕⁋䢅ﯫ訆݊ⵕ건
썁㙁䠼臩蚁䬣ݍ⓸⤵犕꺭ཛྷ잁闓襥鯽啌ꟴ翏㫺ܪሷ뢛快腊机ᰵ蟽ﳥɴ馣䪚軇鿾㹄Ꝓ㿈뿭땧颟ᜒ纈ꔧ毚뒢兊屼
矵귳옘䕌Ⱌ`凣쐕튌ằ惿獄ꍝ䫗끒뮌錑㶩ዒ絽鹣煋襁ꨔᔵ팋屜姙ꙇᡛ뾗꘎焑酸ಹ乵텣쳊疟䉴투꿠㱎ᅧ텎ᑽﹽ跡
橛櫯ꆠ葲逊ᵈ엦災盨捻棉䟔縆⦽㯠侄ᙑד볓끀謹翆滳ץ픎Ꝛ餮范샥➮⊠㇔鐿詥ꊔ텦䟑徜ꮉ绳䜁빎학⮴䑢悋铃揍挛⭂장踛ﻥ螴阶ퟠ햇
ᶭ䯵꧓擃轤ꦧꦛ
设置固定size尝试
def arbUnicodeGen(size: Int) =
Gen.listOfN(size, Arbitrary.arbChar.arbitrary).map(_.mkString)
然后
"arbUnicodeGen" should "generate fixed length arbitrary strings" in {
forAll(arbUnicodeGen(10)) { s =>
println(s)
}
}
它可以在没有可变缓冲区或变量的情况下完成。
import java.lang.Character
import util.Random
def randomUnicodeString(length: Int) =
LazyList.continually(Random.nextInt(0xFFFF))
.collect{case c if Character.isDefined(c) => c.toChar}
.take(length)
.mkString