$core_v2_widget.GetStringValue() vs. GetHtmlValue()?

I was building a widget and had inadvertently used $core_v2_widget.GetStringValue() instead of $core_v2_widget.GetHtmlValue() and noticed some differences.  I feel that understanding what is going on under the hood allows me to be an effective developer, so I had some questions.

Q: $core_v2_widget.GetStringValue() converted the URL in an HTML snippet (shown below).  Why does it do this, and are there any other transformations that it performs?

Example input value: <a href="https://community.telligent.com/community/11">Click me</a>

Example output: <a href="~/community/11">Click me</a>

Q: How does $core_v2_widget.GetHtmlValue() differ from $core_v2_widget.GetStringValue()?

Q: $core_v2_ui.Render() is supposed to make the content "safe".  What does "safe" mean?  And how do the transformations change when you use the optional "target" value?

Many thanks.