AFAIK, you typically are only limited by the hardware/standards...
Which, as I understand it,
is a problem: they way a keyboard communicates with a computer using the standard USB HID standard (or for that matter, PS/2) is to report the scan codes of the keys which have been pressed or released — so, for example, a keyboard can report that "shift" was pressed, "2" pressed, then "2" released (actually, the scan codes for "shift" and "2" not the key mapping) — but depending on keyboard layout shift+2 may mean " or may mean @ (or maybe something else).
Working higher up the chain with whatever software the OS uses to map scan codes to characters doesn't have this problem, and additionally allows characters not usually found on keyboards (€, —, →, ∋, α, ζ, ≥, ß, ... : a small sample of what is on my keyboard).