Didn't realize FormFunction wouldn't work if the label had a non-standard unicode character at all... that's really a pretty dumb bug (and it's definitely a bug).
Here's a way that leverages halirutan's work on building a regex for all web-displayable characters, but which instead only matches Mathematica-specific characters:
rangify[n_Integer] :=
With[{result =
rangifyC[Boole[LetterQ[FromCharacterCode[#]] & /@ Range[n]]]},
If[Length[result] > 0, Partition[result, 2], {}]];
rangifyC =
Compile[{{l, _Integer, 1}},
Module[{pos = 1, current = 0, bag = Internal`Bag[Most[{0}]]},
While[pos <= Length[l], current = l[[pos]];
If[current == 1, Internal`StuffBag[bag, pos];];
While[l[[pos]] == current, pos++;
If[pos > Length[l], Break[]];];
If[current == 1, Internal`StuffBag[bag, pos - 1]]];
Internal`BagPart[bag, All]]];
toMRange[{n_, n_}] := FromCharacterCode[n];
toMRange[range_] := StringRiffle[FromCharacterCode /@ range, "-"];
toNotRegex[n_Integer] :=
RegularExpression["[^" <> Map[toMRange, rangify[n]] <> "]"];
mregex =
toNotRegex[2^16 - 1];
Then we just use this to escape all Mathematica characters:
safeFormFunctionSpec[
fspec_
] :=
fspec /. s_String :>
StringReplace[s,
bad : mregex :> "\\[" <> CharacterName[bad] <> "]"];
safeFormFunction[fspec_, body_] :=
FormFunction[safeFormFunctionSpec[fspec], body]

then this works:
CloudDeploy[
safeFormFunction[
{
{"x", "\[Rule]"} -> "Number",
{"y", "\[WolframLanguageLogo]"} -> "Number",
{"z", "α"} -> "Number",
{"a", "♡"} -> "Number"
},
Identity
],
"test_form",
Permissions -> "Public"
]
One thing to note: Mathematica's implementation of HTML export is actually even worse than expected. It won't even allow you to use non-Western characters. This is a serious flaw. Try this:
CloudDeploy[
safeFormFunction[
{
{"x", "\[Rule]"} -> "Number",
{"y", "\[WolframLanguageLogo]"} -> "Number",
{"z", "α"} -> "Number",
{"a", "♡"} -> "Number",
{"b", "사랑"} -> "Number"
},
Identity
],
"test_form",
Permissions -> "Public"
]
And you'll see that it quietly fails... really pretty lackluster performance on WRI's part here.
Original: Making characters display in FormPage
So the main issue here is that the font-faces where those characters are defined aren't loaded.
I had to handle this for a tutorial website I developed. If you look most of the way down on this page you'll see the classic "\[Wolf]" though. Took me about a day to figure out how to get it on there.
If we want to get this in the cloud we can use the fonts that I already deployed, linking them in a block immediately preceding the content. This causes for a minor blip before they actually load, but I don't think there's a better way with this stuff.
CloudDeploy[
FormPage[
{
Style[
"<style>
@font-face {
font-family: 'Mathematica';
src: \
url('https://www.wolframcloud.com/objects/b3m2a1.testing/tutorial/\
theme/fonts/mathematica/Mathematica.eot');
src: \
url('https://www.wolframcloud.com/objects/b3m2a1.testing/tutorial/\
theme/fonts/mathematica/Mathematica.eot?#iefix') \
format('embedded-opentype'),
url('https://www.wolframcloud.com/objects/b3m2a1.testing/\
tutorial/theme/fonts/mathematica/Mathematica.woff') format('woff'),
url('https://www.wolframcloud.com/objects/b3m2a1.testing/\
tutorial/theme/fonts/mathematica/Mathematica.ttf') \
format('truetype');
font-weight: normal;
}
label { font-family: 'Mathematica'}
</style>",
"Text"
],
{"x", "\[Rule]"} -> "Number",
{"y", "\[WolframLanguageLogo]"} -> "Number"
},
# &
],
"test_form",
Permissions -> "Public"
]
And you get the desired result:

FormFunctionshould work the same. They both useFormObjectto build the form. – b3m2a1 Mar 07 '18 at 16:06FormFunctiondid anything different. As long as you can inject that"<style>...</style>"block before your page you'll be fine. But give me a moment to try to make a workaround. I think this is also a bug asFormFunctiondidn't used to complain about things like this. – b3m2a1 Mar 07 '18 at 18:03