As for your first question, Standards.URI.http_encode appears to be correct since only 7-bit chars are allowed in URIs (it does however also encode some 8-bit chars that it really doesn't have to do). To follow the standards accurately, we should rather add a Standards.IRI (see RFC 3987) which handles wider chars and transformation to/from URIs.
Same reasoning can be applied to Protocols.HTTP, btw: The http scheme is only defined for URIs and hence simply can't handle chars wider than 7 bits. But in that case it's practical to implicitly "switch" to IRI when wider chars are detected and automatically do the transformation to URI.